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

Kau*_*che 3 lambda java-8 java-stream

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

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

dav*_*xxx 5

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

例如这里:

genre.stream().peek(s-> s.replace("r","x"))
Run Code Online (Sandbox Code Playgroud)

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());
Run Code Online (Sandbox Code Playgroud)