近年来,随着Java的8流工作时,我碰到一个NullPointerException
上降低操作来与下面的测试案例工作时:NPE的Java流减少操作
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
或者:
Integer i = s.stream().filter(Objects::nonNull).reduce(Integer::sum).orElse(null);
// returns a value i.e null
在检查减少操作时,我遇到了执行减少操作的类:
class ReducingSink implements AccumulatingSink<T, Optional<T>, ReducingSink> {
private boolean empty;
private T state;
public void begin(long size) {
empty = true;
state = null;
}
@Override
public void accept(T t) {
if (empty) {
empty = false;
state = t;
} else {
state = operator.apply(state, t);
}
}
@Override
public Optional<T> get() {
return empty ? Optional.empty() : Optional.of(state);
}
@Override
public void combine(ReducingSink other) {
if (!other.empty)
accept(other.state);
}
}
在上面的代码中,如果布尔型empty
为假,则看到get()
方法返回可选值,在我的情况下,该值为false,但state
为空,因此Optional.of(null)
将抛出NullPointerException
。在我的情况下,我有一个二进制运算符,它允许null
。
所以我觉得代码
return empty ? Optional.empty() : Optional.of(state);
应改为
return empty || state == null ? Optional.empty() : Optional.of(state);
正如我的二进制运算符(其具有减少的任务),并且是好的与null
。
'Optional.ofNullable'如何?无论如何,你的例子看起来不正确,因为你在'BinaryOperator'中使用'List '。 –
Pshemo
@Pshemo'ReducingSink'是一个内部jdk类 – Eugene
反正 - @ Pshemo是对的 - 这个例子编译得不好:-) –