两个
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());
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)