首页 > 解决方案 > 外循环流但收集到内循环对象列表

问题描述

我有一个外循环和内循环。他们看起来像:

List<InnerObject> result = new ArrayList<>(innerObjects.size());
        for (OuterObject outerObject : outerObjects) {
            for (InnerObject innerObject : innerObjects) {
                if (someBooleanMethod(innerObject, outerObject)) {
                    result.add(innerObject);
                    break;
                }
            }
        }

正如您所看到的,对于每个外部对象,我遍历内部列表并检查项目,如果通过我的检查它们相等,我将内部对象添加到结果列表中。

我想使用 Stream API 重写它,但我面临一个问题,我无法将它收集到内部对象列表中。

下面的解决方案几乎可以正常工作,但它会创建一个 OuterObjects 列表而不是 Inner。

  List<OuterObject> result = outerObjects.stream()
                    .filter(outerObject -> innerObjects().stream()
                            .anyMatch(innerObject -> someBooleanMethod(innerObject, outerObject).
                    .collect(Collectors.toList());

如何重写它以获得列表InnerObjects

标签: javajava-stream

解决方案


只需流过内部List

List<InnerObject> result = 
    innerObjects.stream()
                .filter(innerObject -> outerObjects.stream()
                                                   .anyMatch(outerObject -> someBooleanMethod(innerObject, outerObject)))
                .collect(Collectors.toList());

或者,如果您必须通过外部流式传输List,则map每个OuterObject匹配到第一个匹配InnerObject

List<InnerObject> result = 
    outerObjects.stream()
                .map(outerObject -> innerObjects.stream()
                                                .filter(innerObject -> someBooleanMethod(innerObject, outerObject))
                                                .findFirst()
                                                .orElse(null))
                .filter(Objects::nonNull)
                .collect(Collectors.toList());

推荐阅读