未调用Stream.mapfilter中的Lambda

未调用Stream.mapfilter中的Lambda,第1张

未调用Stream.map/filter中的Lambda

两个

Stream#filter
Stream#map
是中间 *** 作,这意味着它们被懒惰地评估。根据文档:

中间 *** 作返回一个新的流。他们总是很懒惰。执行诸如filter()之类的中间 *** 作实际上并不会执行任何过滤,而是会创建一个新的流,该流在遍历时将包含与给定谓词匹配的初始流的元素。在执行管道的终端 *** 作之前,不会开始遍历管道源。

无论如何,您都应该使用适当的方法来避免此类错误。

forEach
应该用来代替流,
map
因为
Stream#map
它用于将流转换为在每个元素上调用映射函数的结果,而
Stream#forEach
用于对其进行迭代。

演示:https :
//ideone.com/ZQhLJC

strings  .stream()  .filter(x -> !distinct.add(x))  .forEach(extras::add);

另一个可能的解决方法是执行终端 *** 作,例如

.collect
强制应用过滤器和地图。

strings  .stream()  .filter(x -> !distinct.add(x))  .map(extra -> extras.add(extra)).collect(Collectors.toList());

如果要使用

.collect
,则最好使用收集的列表,
extras
以避免浪费时间和空间。

List<String> extras = strings  .stream()  .filter(x -> !distinct.add(x)).collect(Collectors.toList());


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5475880.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存