最近,在使用Java 8流时,我在NullPointerException使用以下测试用例时遇到了一个reduce操作:
private static final BinaryOperator<Integer> sum = (a, b) -> {
if (a == null) return b;
if (b == null) return a;
return Integer.sum(a, b);
};
List<Integer> s = new ArrayList<>();
s.add(null);
s.add(null);
s.add(null);
Integer i = s.stream().reduce(sum).orElse(null);
// throws NPE
Integer i = s.stream().reduce(sum).orElse(2);
// throws NPE
Integer i = s.stream().reduce(null,(a, b)->null);
// returns a value i.e null
Run Code Online (Sandbox Code Playgroud)
或者:
Integer i = s.stream().filter(Objects::nonNull).reduce(Integer::sum).orElse(null);
// returns a value i.e null
Run Code Online (Sandbox Code Playgroud)
检查reduce操作后,我遇到了执行reduce操作的类:
class ReducingSink implements AccumulatingSink<T, Optional<T>, …Run Code Online (Sandbox Code Playgroud)