java8使用累加器和合并器减少流

时间:2020-04-01 17:47:12

标签: java lambda java-stream

我正在尝试编写一个简单的reduce函数,该函数将检查 srcList中是否包含targetList的所有元素

List<String> srcList = Arrays.asList("a", "b");
        List<String> targetList = Collections.singletonList("a");

        Boolean result = srcList.stream().reduce(true
                , (prevResult, srcElement) -> targetList.contains(srcElement)
                , (prevResult, currentResult) -> prevResult && currentResult);

System.out.println(result); // prints false as expected

上述lambda似乎没有按预期运行。例如,如果我们更改目标列表中的元素,则结果显示为true:

List<String> srcList = Arrays.asList("a", "b");
        List<String> targetList = Collections.singletonList("b");

        Boolean result = srcList.stream().reduce(true
                , (prevResult, srcElement) -> targetList.contains(srcElement)
                , (prevResult, currentResult) -> prevResult && currentResult);

System.out.println(result); // prints true

该表达式似乎仅返回上一次accumulator求值的结果(在这种情况下,即包含操作),并且组合器未对所有结果执行&&

有人可以解释吗?

1 个答案:

答案 0 :(得分:3)

问题是您忽略了累加器中的prevResult

(prevResult, srcElement) -> targetList.contains(srcElement)
例如,

应该是

(prevResult, srcElement) -> prevResult && targetList.contains(srcElement)

但老实说,使用containsAll会更容易:

targetList.containsAll(srcList)
相关问题