首页 > 解决方案 > 为什么 Stream.mapToInt 不处理 NullPointerExceptions?

问题描述

此代码将给出 NullPointerException。mapToInt (map) 方法不应该处理 NPE 吗?

List<Integer> list = Arrays.asList(null, null);
OptionalDouble op = list.stream()
    .mapToInt(val->val)
    .average();

标签: javajava-8nullpointerexceptionjava-stream

解决方案


为什么你期望它处理NullPointerException

lambda 表达式val->val等价于:

new ToIntFunction<Integer> () {
    int applyAsInt(Integer value) {
        return value;
    }
}

当具有int返回类型的方法返回 时Integer,会发生自动拆箱。这意味着value.intValue()被调用,如果valuenullNullPointerException则被抛出。

mapToInt()只需为 . 的每个元素调用传递给它applyAsInt()的实例的方法。ToIntFunctionStream

它没有理由检查一个元素是否存在null并以某种方式处理它,因为它无法知道您希望如何处理nulls。ToIntFunction决定这一点是实例的工作,而您ToIntFunction不处理nulls.


推荐阅读