mapToLong 不起作用后过滤非空

Jon*_*Fan 2 java lambda filter

我的代码是这样的

class A {
    private Long b;

    public Long getB() {
        return b;
    }

    public void setB(Long b) {
        this.b = b;
    }

    public static void main(String[] args) {
        A a1 = new A();
        List<A> list = new ArrayList<>();
        list.add(a1);
        list.stream().mapToLong(A::getB).filter(Objects::nonNull).sum();
    }
}
Run Code Online (Sandbox Code Playgroud)

我想过滤空值,但它不起作用,并给我一个 NullPointerException。
如果我在 mapToLong 之前过滤,比如

list.stream().filter(a -> a.getB()!=null).mapToLong(A::getB).sum();
Run Code Online (Sandbox Code Playgroud)

它运作良好。我想知道为什么。

ass*_*ias 5

mapToLong转换Longlong- 如果是,null你确实会得到一个例外。

您需要在转换之前过滤nulls :

list.stream()
    .map(A::getB)
    .filter(Objects::nonNull)   //filter the nulls first
    .mapToLong(Long::longValue) //then convert to primitive
    .sum();
Run Code Online (Sandbox Code Playgroud)