我似乎无法理解 Java 如何将流操作组合到流管道中。
执行以下代码时
public
static void main(String[] args) {
StringBuilder sb = new StringBuilder();
var count = Stream.of(new String[]{"1", "2", "3", "4"})
.map(sb::append)
.count();
System.out.println(count);
System.out.println(sb.toString());
}
Run Code Online (Sandbox Code Playgroud)
控制台只打印4
. 该StringBuilder
对象仍然具有值""
。
当我添加过滤操作时: filter(s -> true)
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
var count = Stream.of(new String[]{"1", "2", "3", "4"})
.filter(s -> true)
.map(sb::append)
.count();
System.out.println(count);
System.out.println(sb.toString());
}
Run Code Online (Sandbox Code Playgroud)
输出更改为:
4
1234
Run Code Online (Sandbox Code Playgroud)
这个看似多余的过滤操作如何改变组合流管道的行为?
我们在流上有窥视功能,这是接受消费者的中间功能.那么在我的情况下为什么不用"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)