我正在尝试编写一个简单的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
求值的结果(在这种情况下,即包含操作),并且组合器未对所有结果执行&&
。
有人可以解释吗?
答案 0 :(得分:3)
问题是您忽略了累加器中的prevResult
:
(prevResult, srcElement) -> targetList.contains(srcElement)
例如,应该是
(prevResult, srcElement) -> prevResult && targetList.contains(srcElement)
但老实说,使用containsAll
会更容易:
targetList.containsAll(srcList)