如何在级联流中返回内部方法的结果

时间:2016-09-01 14:14:20

标签: java java-stream

如何使用Java Stream API减少以下语句?

String code = "searchcode";
Inner result;
 for (Outer outer : outerList) {
        for (Middle middle : outer.getMiddleList()) {
            Inner inner = middle.getResultForCode(code);
                if (inner != null) {
                   result = inner;
                }
        }
    }

我想得到"内心"或" inner.getRelevantThing()"

类似的东西:

Optional<Inner> result = outerList.forEach(middle ->
    middle.stream()
    .filter(middle.getResultForCode(code))
    .findFirst());

1 个答案:

答案 0 :(得分:3)

您可以使用flatMap展平嵌套流。

Optional<Inner> result = outerList.stream()
    .flatMap(outer -> outer.getMiddleList().stream())
    .map(middle -> middle.getResultForCode(code))
    .filter(Objects::nonNull)
    .findAny();

(请注意findAny会找到任何匹配的项目,而不是代码所做的最后一个匹配项目。)

如果您想要&#34;相关内容&#34;,您可以将映射应用于Optional<Inner>

outerList.stream()
    .flatMap(outer -> outer.getMiddleList().stream())
    .map(middle -> middle.getResultForCode(code))
    .filter(Objects::nonNull)
    .findAny()
    .map(Inner::getRelevantThing);