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()));
短了一行,但从我在peek文档中所读的内容来看:
API注意: 存在此方法主要是为了支持调试,您需要在其中查看元素流过管道中特定点的情况:
那么,IntelliJ的建议有误导性吗?
答案 0 :(得分:2)
示例:
如果您在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文档中的说明,并相应地使用它。
答案 1 :(得分:0)
否不会引起误解。 JavaDoc指出:
偷看
流窥视(消费者行为)
另外返回由该流的元素组成的流 在每个元素上执行提供的操作,因为元素是已消耗 产生的流。
JavaDoc非常清楚,peek可以修改流。