为什么 Stream.mapToInt 不处理 NullPointerExceptions?

Ale*_*nov 3 java nullpointerexception java-8 java-stream

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

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

Era*_*ran 6

你为什么期望它处理NullPointerException

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

new ToIntFunction<Integer> () {
    int applyAsInt(Integer value) {
        return value;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

mapToInt()简单地为 的每个元素调用传递给它applyAsInt()ToIntFunction实例的方法Stream

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