在java中,为什么流peek对我不起作用?

时间:2017-10-27 12:44:46

标签: lambda java-8 java-stream

我们在流上有peek功能,它是接受消费者的中间功能。那么在我的情况下为什么不用“x”代替“r”。 peek应该理想地用于调试目的,但我只是想知道为什么它不起作用。

{{1}}

2 个答案:

答案 0 :(得分:5)

因为peek()接受了Consumer Consumer旨在接受参数但不返回任何结果。

例如:

genre.stream().peek(s-> s.replace("r","x"))

s.replace("r","x")确实已执行,但它不会更改流的内容 在调用String之后,它只是一个方法范围的peek()实例,超出了范围。

要进行测试,请将peek()替换为map()

List<String> genre = new ArrayList<String>(Arrays.asList("rock", "pop", "jazz", "reggae"));
System.out.println(genre.stream().map(s -> s.replace("r", "x"))
                                 .peek(s -> System.out.println(s))
                                 .filter(s -> s.indexOf("x") == 0).count());

答案 1 :(得分:1)

假设您正在尝试在流中调试操作管道,您可以使用它来打印或记录流的结果。

这是流操作窥视可以帮助的地方。其目的是在流消耗时对流的每个元素执行操作。 但它并不像ForEach那样消耗整个流;它将执行操作的元素转发到管道中的下一个操作。

在你的情况下你应该喜欢这个。

List<String> genre = new ArrayList<String>(Arrays.asList("rock", "pop", 
"jazz","reggae"));
   genre.stream()
       .peek(s -> System.out.println("from stream:" + s))
       .map(x -> x.replace("r", "x"))
       .peek(s -> System.out.println("from replace stream:" + s))
       .filter(y -> y.indexOf("y") == 0)
       .peek(s -> System.out.println("from stream:" + s ))
       .collect(toList());