collection.stream().map(x -> {
if(condition) {
x.setY(true);
}
return x;
}).collect(Collectors.toList()));我有一个集合,当满足某个条件时,我想在x变量中设置一些东西。我这样做就像上面的代码所显示的那样。它做好了它的工作,而且起了作用。然而,IntelliJ建议我将.map与.peek交换。所以代码看起来是:
collection.stream().peek(x -> {
if(condition) {
x.setY(true);
}
}).collect(Collectors.toList()));它缩短了一行,但根据我在窥视文档上所读到的内容:
API注意:此方法的存在主要是为了支持调试,在调试过程中,当元素流经管道中的某个点时,您希望看到它们:
那么,IntelliJ的建议是否具有误导性?
发布于 2018-08-02 07:53:23
示例:
如果在java 8中使用peek()和count(),那么peek()就能工作,但是如果在java 9中使用它,除非您有filter(),否则它不会工作,因为java 9中的count()并不会覆盖所有元素。
您应该更喜欢forEach而不是peek。
List<Integer> l = new ArrayList<>(Arrays.asList(1,2,3));
long c = l.stream().peek(System.out::println).count();
System.out.println(c);试试上面在java 8和9中的代码,看看不同之处。我的观点是,您应该遵循API文档的内容,并相应地使用它。
发布于 2018-08-02 07:52:46
不,不是误导。JavaDoc指出:
窥视 小溪窥视(消费者诉讼) 返回一个由该流的元素组成的流,此外,对每个元素执行提供的操作,因为元素是从结果流中消耗的。
JavaDoc非常清楚,peek具有修改流的能力。
https://stackoverflow.com/questions/51648176
复制相似问题