Lambda 在java中,为什么stream peek不适合我?

Lambda 在java中,为什么stream peek不适合我?,lambda,java-8,java-stream,Lambda,Java 8,Java Stream,我们在流上有peek函数,它是接受消费者的中间函数。那么在我的例子中,为什么它不把“r”替换为“x”。 peek最适合用于调试目的,但我只是想知道为什么它在这里不起作用 List<String> genre = new ArrayList<String>(Arrays.asList("rock", "pop", "jazz", "reggae")); System.out.println(genre.stream().peek(s-> s.replace("r",

我们在流上有peek函数,它是接受消费者的中间函数。那么在我的例子中,为什么它不把“r”替换为“x”。 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()); 
List-genre=newarraylist(Arrays.asList(“摇滚”、“流行”、“爵士”、“雷鬼”));
System.out.println(genre.stream().peek(s->s.replace(“r”,“x”)).peek(s->System.out.println(s)).filter(s->s.indexOf(“x”)=0.count();
因为
peek()
接受
消费者

使用者
被设计为接受参数,但不返回结果

例如:

genre.stream().peek(s-> s.replace("r","x"))
s.replace(“r”,“x”)
确实执行了,但它不会更改流的内容。
调用
peek()
后,它只是一个作用域为
String
的方法实例,超出了作用域

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

List-genre=newarraylist(Arrays.asList(“摇滚”、“流行”、“爵士”、“雷鬼”));
System.out.println(genre.stream().map(s->s.replace(“r”,“x”))
.peek(s->System.out.println(s))
.filter(s->s.indexOf(“x”)==0.count());

假设您试图调试流中的操作管道,您可以使用forEach打印或记录流的结果

这就是流操作peek可以提供帮助的地方。它的目的是在流的每个元素被消费时对其执行操作。 但它不像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());
List genre=newarraylist(Arrays.asList(“摇滚”、“流行”,
"爵士乐","雷鬼"),;
tream.stream()
.peek(s->System.out.println(“从流:+s))
.map(x->x.replace(“r”、“x”))
.peek(s->System.out.println(“从替换流:+s))
.filter(y->y.indexOf(“y”)==0)
.peek(s->System.out.println(“从流:+s))
.collect(toList());

Java中的字符串是不可变的-
s.replace(“r”,“x”)
创建一个新字符串,该字符串将被丢弃。
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());