日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 8中Collectors.toMap空指针异常源码分析

發布時間:2023/12/8 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 8中Collectors.toMap空指针异常源码分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

當需要將一個List轉換為Map時,可以使用 Java 8 中的 Collectors.toMap() 方法,Map是由key-value組成的鍵值對集合,在使用Collectors.toMap() 方法時,如果值為空,會報空指針異常,下面通過一個實例來驗證一下。

首先定義一個 Student.java 類

package com.magic.npe;public class Student {private String name;private Integer age;public Student(String name, Integer age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;} }

再創建一個 Test.java 類,用來驗證將 List 轉換為 Map<String, Integer>。

package com.magic.npe;import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors;public class Test {public static void main(String[] args) {List<Student> students = new ArrayList<>();students.add(new Student("張三", 18));students.add(new Student("李四", 21));students.add(new Student("王五", null));Map<String, Integer> studentMap = students.stream().collect(Collectors.toMap(Student::getName, Student::getAge));System.out.println(studentMap);} }

運行程序,直接報出如下的錯誤信息

Exception in thread "main" java.lang.NullPointerExceptionat java.util.HashMap.merge(HashMap.java:1224)at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)at com.magic.npe.Test.main(Test.java:16)

查看一下 Collectors.toMap() 方法的源碼,如下:

public static <T, K, U>Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,Function<? super T, ? extends U> valueMapper,BinaryOperator<U> mergeFunction) {return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new); }

默認會創建一個 HashMap,繼續查看源碼:

public static <T, K, U, M extends Map<K, U>>Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,Function<? super T, ? extends U> valueMapper,BinaryOperator<U> mergeFunction,Supplier<M> mapSupplier) {BiConsumer<M, T> accumulator= (map, element) -> map.merge(keyMapper.apply(element),valueMapper.apply(element), mergeFunction);return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID); }

通過 Map.merge() 方法來合并,源碼如下:

default V merge(K key, V value,BiFunction<? super V, ? super V, ? extends V> remappingFunction) {Objects.requireNonNull(remappingFunction);Objects.requireNonNull(value);V oldValue = get(key);V newValue = (oldValue == null) ? value :remappingFunction.apply(oldValue, value);if(newValue == null) {remove(key);} else {put(key, newValue);}return newValue; }

可以看到,在 merge() 方法中,要求 value 值不能為空

Objects.requireNonNull(value);

繼續查看一下 Objects.requireNonNull() 方法的源碼

public static <T> T requireNonNull(T obj) {if (obj == null)throw new NullPointerException();return obj; }

如果值為空,則會直接報出 NullPointerException 異常。

那么,對于這個空指針異常問題,如何解決呢?一般有兩種方式:

(1)替換空值null為一個默認值,比如0

package com.magic.npe;import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors;public class Test {public static void main(String[] args) {List<Student> students = new ArrayList<>();students.add(new Student("張三", 18));students.add(new Student("李四", 21));students.add(new Student("王五", null));Map<String, Integer> studentMap = students.stream().collect(Collectors.toMap(Student::getName, s -> Optional.ofNullable(s.getAge()).orElse(0)));System.out.println(studentMap);} }

運行程序,輸出結果如下:

{李四=21, 張三=18, 王五=0}

(2)調用 collect() 的其他實現方法

package com.magic.npe;import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;public class Test {public static void main(String[] args) {List<Student> students = new ArrayList<>();students.add(new Student("張三", 18));students.add(new Student("李四", 21));students.add(new Student("王五", null));Map<String, Integer> studentMap = students.stream().collect(HashMap::new, (map, student) -> map.put(student.getName(), student.getAge()), HashMap::putAll);System.out.println(studentMap);} }

運行程序,輸出結果如下:

{李四=21, 張三=18, 王五=null}

總結

以上是生活随笔為你收集整理的Java 8中Collectors.toMap空指针异常源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。