我们在流上有peek功能,它是接受消费者的中间功能。那么在我的情况下为什么不用“x”代替“r”。 peek应该理想地用于调试目的,但我只是想知道为什么它不起作用。
{{1}}
答案 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());