JDK8 toMap空指標異常

2021-09-24 10:38:07 字數 1967 閱讀 2544

統計所有產品,並且獲取到每個產品對應的過期時間expireday(),得到map型別結果。

queryproductlistrequest productlistrequest = new queryproductlistrequest();

// productlistrequest.setisactive("1");

listproductinfodtos = productinfoservice.queryproductinfolist(productlistrequest).getproductinfodtos();

mapproductmap = productinfodtos.stream().collect(collectors.tomap(productinfodto::getproductid, productinfodto::getexpireday));

資料庫中的資料(僅展示過期時間字段):

最後兩個產品的過期時間是空的,

本想著上面**執行完畢,在最後兩個產品會存入map,結果丟擲了異常,檢視collectors.tomap原始碼:

檢視tomap:

merge方法:

此處標明若傳遞的value是空的話,則丟擲空指標異常。

所有這就是拋異常的原因。

mapproductmap = productinfodtos.stream().collect(collectors.tomap(productinfodto::getproductid, e -> optional.ofnullable(e.getexpireday()).orelse(2)));
用optional.ofnullable設定為空的時候預設值就好了,這樣就不會有空值

在呼叫tomap 方法時候

有個方法throwingmerger(),預設是丟擲illegalstateexception異常

注釋說明:

返回乙個合併函式,該函式適用於 map merge(物件、物件、雙功能)map.merge()或 tomap(function,function,binaryoperator)tomap(),它始終throws@code illegalstateexception。這可以用來強制使所收集的元素是不同的。

這樣的話,如果新增乙個相同的key,想把上個key對應的value的擠出去,就會拋異常,,但是最終的merge方法呼叫的還是hashmap中的,hashmap中的是會把以前的值替換掉,要是不想被這個方法拋異常,可以這麼寫:

mapmap = list.stream().collect(collectors.tomap(productinfodo::getproductid, productinfodo::getexpireday,(oldvalue, newvalue) -> newvalue));
這樣就會把原先的值替換掉

jdk8中使用toMap主鍵衝突

開始行動,你已經成功一半了,獻給正在奮鬥的我們 今天線上產品經理新增了乙個需求,其中我做了乙個操作,將乙個集合使用jdk8分解成乙個map,結果丟擲了異常,是因為map的鍵衝突了,那我我們就想了,如果我們想保留其中乙個而不是直接丟擲異常該怎麼做呢?原 如下 map collect1 attendan...

空指標異常記錄

空指標異常是指 當應用程式試圖在需要物件的地方使用 null 時,丟擲該異常。也就是你沒有建立這個物件,你卻呼叫他,或者呼叫他的方法,或者訪問 修改他的屬性,這時會丟擲乙個空指標異常。我這兩天遇到的問題是,我傳入乙個為null的屬性,或者沒有傳入必要屬性,就會在return的地方報乙個空指標異常。注...

Android context空指標異常

fragment中的 context 是null public class placeholderfragment extends fragment 這樣定義的context是null。當然咯,我實際 不是這樣寫的,可是這個意思。假設是在activity中就不會是空。在fragment中就是null...