【发布时间】:2020-10-29 11:50:33
【问题描述】:
我正在尝试通过在使用Stream.filter 和Stream.map 时将它们添加到Set 和List 来分离List 中的重复项和非重复项
List<String> strings = Arrays.asList("foo", "bar", "foo", "baz", "foo", "bar");
Set<String> distinct = new HashSet<>();
List<String> extras = new ArrayList<>();
strings
.stream()
.filter(x -> !distinct.add(x))
.map(extra -> extras.add(extra));
最后,我希望 distinct 为 [foo, bar, baz] 和 extras 为 [foo, foo, bar],因为有 2 个额外的 foo 实例和 1 个 bar。但是,在我运行它之后它们都是空的。
永远不会调用给流的 lambda,我通过尝试在 map 中打印来验证这一点:
.map(extra -> {
System.out.println(extra);
return extras.add(extra);
})
当我尝试将put 与Map 一起使用时,这也不起作用。我做错了什么?
注意:可能还有其他类似的问题,但我正在寻找一种规范的答案来解释为什么这类东西不适用于 Java 8 的 Streams。如果你能把这个问题变成一个更笼统的问题(即使这意味着完全改变它),我会很感激的。
【问题讨论】:
标签: java lambda java-8 functional-programming java-stream