国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JAVA8新特性stream流收集為Map,value為null導(dǎo)致空指針的問題

這篇具有很好參考價值的文章主要介紹了JAVA8新特性stream流收集為Map,value為null導(dǎo)致空指針的問題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

jdk8

新特性stream深受喜愛,平時使用比較多,其中有:

Map<String, String> collect2 =?
list.stream().collect(Collectors.toMap(Book::getName,?Book::getIdNO,(pre, after) -> pre));

?現(xiàn)象如下:

package MainTest.stream;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

public class StreamListToMap {

    public static void main(String[] args) {
        List<Book> list = new ArrayList<>();
        list.add(new Book("master amber", 1987, "ASHJBYGSFDFG15"));
        list.add(new Book("slaver amber", 1987, "IJFGNMKETRE58"));
        list.add(new Book("master amber", 1999, "MYHGORPJFJ64"));
        list.add(new Book("ssdas", 12414, null));
        list.add(new Book("fkajh", 32423, null));


        // 問題1:jdk8這種情況下,value為空會報錯,jdk9解決了這個問題(key為null沒有問題)
        System.out.println("==============");
        Map<String, String> collect2 = list.stream().collect(Collectors.toMap(Book::getName, Book::getIdNo,(pre, after) -> pre));
        for (String key : collect2.keySet()) {
            System.out.println("key:"+key + "=======value:"+collect2.get(key));
        }

    }


    public static class Book {
        private String name;

        private int year;

        private String idNo;

        Book(String name, int year, String idNo) {
            this.name = name;
            this.year = year;
            this.idNo = idNo;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getYear() {
            return year;
        }

        public void setYear(int year) {
            this.year = year;
        }

        public String getIdNo() {
            return idNo;
        }

        public void setIdNo(String idNo) {
            this.idNo = idNo;
        }
    }
}

JAVA8新特性stream流收集為Map,value為null導(dǎo)致空指針的問題

問題:JDK8環(huán)境下,如果Book::getIdNo 為null的話會報空指針,即JDK8環(huán)境下的,該接口不支持value為null(key為null沒這個問題)

<R, A> R collect(Collector<? super T, A, R> collector);

該接口不支持valueMapper為null,JDK9解決了這個問題?

解決方案:

1.升級JDK9

2.按需求可以過濾掉null的value?

3.使用另一個collect接口

<R> R collect(Supplier<R> supplier,BiConsumer<R, ? super T> accumulator,
              BiConsumer<R, R> combiner);

Supplier<R> supplier :收集器返回的容器

BiConsumer<R, ? super T> accumulator : 消費者,R參數(shù)是返回結(jié)果類型,? super T 一般值list內(nèi)元素

BiConsumer<R, R> combiner:聯(lián)合器,主要是并行流下使用(parallel),非并行流不使用改參數(shù),但不能為null

package MainTest.stream;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

public class StreamListToMap {

    public static void main(String[] args) {
        List<Book> list = new ArrayList<>();
        list.add(new Book("master amber", 1987, "ASHJBYGSFDFG15"));
        list.add(new Book("slaver amber", 1987, "IJFGNMKETRE58"));
        list.add(new Book("master amber", 1999, "MYHGORPJFJ64"));
        list.add(new Book("ssdas", 12414, null));
        list.add(new Book("fkajh", 32423, null));


        /*// 問題1:jdk8這種情況下,value為空會報錯,jdk9解決了這個問題(key為null沒有問題)
        System.out.println("==============");
        Map<String, String> collect2 = list.stream().collect(Collectors.toMap(Book::getName, Book::getIdNo,(pre, after) -> pre));
        for (String key : collect2.keySet()) {
            System.out.println("key:"+key + "=======value:"+collect2.get(key));
        }*/

        // 問題1解決方案1
        System.out.println("==============");
        HashMap<String, String> collect3 = list.stream().parallel().collect(HashMap::new, (n, v) -> n.put(v.getName(), v.getIdNo()), HashMap::putAll);
        for (String key : collect3.keySet()) {
            System.out.println("key:"+key + "=======value:"+collect3.get(key));
        }
        // 問題1解決方案2 過濾掉null的,看需求
        System.out.println("==============");
        HashMap<String, String> collect4 = list.stream().filter(l-> Objects.nonNull(l) && Objects.nonNull(l.idNo)).collect(HashMap::new, (n, v) -> n.put(v.getName(), v.getIdNo()), HashMap::putAll);
        for (String key : collect4.keySet()) {
            System.out.println("key:"+key + "=======value:"+collect4.get(key));
        }


    }


    public static class Book {
        private String name;

        private int year;

        private String idNo;

        Book(String name, int year, String idNo) {
            this.name = name;
            this.year = year;
            this.idNo = idNo;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getYear() {
            return year;
        }

        public void setYear(int year) {
            this.year = year;
        }

        public String getIdNo() {
            return idNo;
        }

        public void setIdNo(String idNo) {
            this.idNo = idNo;
        }
    }
}

?JAVA8新特性stream流收集為Map,value為null導(dǎo)致空指針的問題

JDK8的bug ,還是新特性功能的bug,并且在下個版本做了修復(fù),特此記錄??!希望能幫到你奧!文章來源地址http://www.zghlxwxcb.cn/news/detail-456286.html

到了這里,關(guān)于JAVA8新特性stream流收集為Map,value為null導(dǎo)致空指針的問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • JAVA8新特性(Stream API,LocalDate,LocalDateTime)

    一. Stream API 1.1 基礎(chǔ) 代碼參數(shù)準(zhǔn)備: 場景一:知道一個ListUser對象,如何獲取ListUser的所有用戶id? 場景二:知道一個ListUser對象,如何獲取ListUser中年齡大于50的用戶? 場景三:知道一個ListUser對象,如何按照年齡從小到小排序,從大到小排序? 場景四:知道一個ListUser對象

    2024年02月16日
    瀏覽(21)
  • 帶你走進(jìn)Java8新特性Stream流的小世界

    帶你走進(jìn)Java8新特性Stream流的小世界

    目錄 一. 什么是流(Stream) 1.1 流的定義 1.2 流的特點 1.3?操作流 1.4 創(chuàng)建流 二. 流的中間操作 2.1 流的篩選與切片 2.1.1 filter 2.1.2 limit 2.1.3 skip 2.1.4 distinct 2.2 流的映射 2.2.1 map 2.2.2 flatMap 2.3 流的排序 2.3.1 sort 三. 流的終止操作 3.1 流的查找與匹配 3.1.1 allMatch 3.1.2 anyMatch 3.1.3 none

    2024年01月24日
    瀏覽(37)
  • java8新特性Stream流中anyMatch和allMatch和noneMatch的使用!??!

    判斷數(shù)據(jù)列表中是否存在任意一個元素符合設(shè)置的predicate條件,如果是就返回true,否則返回false。 接口定義: boolean anyMatch(Predicate? super T predicate); 方法描述: 在anyMatch 接口定義中是接收 Predicate 類型參數(shù),在Lamdba表達(dá)式中 PredicateT 是接收一個T類型參數(shù),然后經(jīng)過邏輯驗證返

    2024年02月08日
    瀏覽(23)
  • Java8使用stream流給List<Map<String,Object>>分組(多字段key)

    Java8使用 stream流 給ListMapString,Object根據(jù)字段key 分組 一、項目場景: 從已得到的List集合中,根據(jù)某一元素(這里指map的key)進(jìn)行分組,篩選出需要的數(shù)據(jù)。 如果是SQL的話則使用 group by 直接實現(xiàn),代碼的方式則如下: 使用到stream流的 Collectors.groupingBy() 方法。 二、代碼實現(xiàn) 1、首

    2024年02月02日
    瀏覽(87)
  • Cannot invoke “Object.toString()“ because the return value of “java.util.Map.get(Object)“ is null

    Cannot invoke “Object.toString()“ because the return value of “java.util.Map.get(Object)“ is null

    在寫瑞吉外賣的時候遇到 Object.toString()為空的問題,最后發(fā)現(xiàn)是 前端沒有往后端傳遞數(shù)據(jù),第一個圖片是只傳的phone最后改為from第二個是沒有寫函數(shù)sendMsgApi,改正后,發(fā)現(xiàn)登錄進(jìn)去又回退到主頁面,發(fā)現(xiàn)是因為在過濾器中要保存session,保存后才能發(fā)送,再次添加形參Http

    2024年02月02日
    瀏覽(32)
  • Stream兩個Map的value值進(jìn)行相加/相減,并將合并數(shù)據(jù)集賦值給新Map

    Stream兩個Map的value值進(jìn)行相加/相減,并將合并數(shù)據(jù)集賦值給新Map

    最近做項目遇到,需要把兩個Map中的value值進(jìn)行相加或相減,循環(huán)遍歷方法太麻煩,有時候數(shù)據(jù)量大的時候,還會超時。因此使用java8中Stream的Merge方法來處理上述問題,使用如下: 結(jié)果截圖: 從結(jié)果圖中可以看出,兩個map進(jìn)行相加或者相減是可以看出,key值相同的進(jìn)行valu

    2024年02月14日
    瀏覽(236)
  • 使用stream流對List<Map<String, Object>>集合根據(jù)value進(jìn)行排序

    第一步:初始化數(shù)據(jù) ========================================================= 第二步:開始排序 ① 根據(jù)數(shù)字排序 打印結(jié)果 ② 根據(jù)字符串排序 打印結(jié)果 ③ 根據(jù)時間類型排序 打印結(jié)果 總結(jié):String類型是萬金油的排序方式,基本都可以用?。?! 補充一個排序方法 打印結(jié)果 就這樣。。。

    2024年02月16日
    瀏覽(97)
  • Java8 - Streams flatMap()

    Java8 - Streams flatMap()

    https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html 它由一個 2 級 Stream 或一個二維數(shù)組組成 。 在 Java 8 中,我們可以使用 flatMap 將上述 2 級 Stream 轉(zhuǎn)換為 一級 Stream 或?qū)?二維數(shù)組轉(zhuǎn)換為 一維數(shù)組。 簡言之, flatmap 方法讓你把一個流中的每個值都換成另一個流,然后把所有

    2024年02月03日
    瀏覽(19)
  • Java8 Stream流的合并

    最近的需求里有這樣一個場景,要校驗一個集合中每個對象的多個Id的有效性。比如一個Customer對象,有3個Id: id1 , id2 , id3 ,要把這些Id全部取出來,然后去數(shù)據(jù)庫里查詢它們是否存在。 通常情況下,我們都是從集合中取出對象的某一個字段,像這樣: 現(xiàn)在要取3個字段,

    2024年02月02日
    瀏覽(29)
  • 《Java8實戰(zhàn)》第11章 用 Optional 取代 null

    《Java8實戰(zhàn)》第11章 用 Optional 取代 null

    11.1 如何為缺失的值建模 上面的這種代碼就很容易出現(xiàn)NullPointerException的異常。 11.1.1 采用防御式檢查減少 NullPointerException 為了避免NullPointerException異常,一般就會加很多判斷。 這種每次引用一次變量都做一次null的檢查。 11.1.2 null 帶來的種種問題 它是錯誤之源。 NullPointerE

    2023年04月19日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包