.map与.peek-Intellij建议

时间:2018-08-02 07:43:30

标签: java

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的建议有误导性吗?

2 个答案:

答案 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可以修改流。