下面的代码不打印任何值。没有打印任何 System.out.println() 语句。我假设 peek 涉及修改数据。令人惊讶的是 peek() 内部的逻辑甚至没有被执行。
如果我使用收集器收集流,我会看到所需的行为。
- 为什么至少 print 语句 1 没有被执行?
- 为什么外部对象(输出列表)没有附加所需的值?
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class HelloWorld {
public static void main(String[] args) {
List<String> input = new ArrayList<>(Arrays.asList("hello", "bye", "vacation"));
List<String> output = new ArrayList<>();
input.stream().peek(x -> {
System.out.println(x+"inside"); // print statement 1
if (x.length() > 3) {
output.add(x.toUpperCase());
}
});
output.forEach(System.out::println); // print statement 2
}
}
代码中存在几个问题:
- Stream 没有被关闭终端操作,因此不会调用任何管道操作。
-
Stream::peek
是主要用于调试的中间操作。
- 您永远不应该在流中使用任何副作用或有状态操作 - 调用
output.add(x.toUpperCase());
不好。
- The
output
为空,因此只要 Stream 未关闭,就不会打印任何内容(请参见第 1 条)。
您只需了解 Stream API 即可包装说明 https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#package.description。最后,你可以得出这样的结论:
List<String> output = input.stream() // Stream<String>
.peek(x -> System.out.println(x + " inside")) // print each value
.filter(x -> x.length() > 3) // filter Strings longer than 3 chars
.map(x -> x.toUpperCase()) // make them uppercase using map
.collect(Collectors.toList()); // to List - a terminal operation
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)