如果 Java 中值不為空,則將值放入 Map 中
1. 概述
在本教程中,我們將學習如何避免在地圖中插入null
值。我們將重點放在Map介面的put()
方法來新增新的鍵值對。
2. 使用if
語句
對於我們的例子,我們將有一個 map 和null String
變數:
private final Map<Integer, String> map = new HashMap<>();
private final String value = null;
只有當變數不為null
時,我們才可以呼叫put()
方法來避免將null
值插入到map
中。這可以透過使用if
語句來完成:
@Test
void givenNullValue_whenUsingIfStatementWithPutMethod_thenObtainMapWithNonNullValues() {
if (value != null) {
map.put(1, value);
}
assertThat(map).isEmpty();
}
如我們所見,透過將put()
方法的呼叫包裝在條件邏輯中,我們避免在映射中插入null
值。
3.使用Optional.ifPresent()
方法
或者,我們可以使用Optional
類別來有條件地呼叫put()
方法:
@Test
void givenNullValue_whenUsingOptionalIfPresentWithPutMethod_thenObtainMapWithNonNullValues() {
Optional.ofNullable(value).ifPresent(nonNullValue-> map.put(1, nonNullValue));
assertThat(map).isEmpty();
}
首先,我們使用ofNullable()
方法取得變數的Optional
。如果存在則此方法傳回一個帶有值的Optional ,如果值為null
則傳回一個空的Optional 。
接下來,如果Optional有值,我們利用ifPresent()
方法有條件地呼叫put()
方法。在我們的例子中,我們有一個空的可選。因此, put()
方法永遠不會被調用,從而保護我們的映射null
空值。
4.使用Stream.filter()
方法
如果我們有一個集合作為潛在可空值的來源,我們可以使用filter()
方法來避免將null
值插入到我們的映射中。一種可能的情況是,我們想從現有地圖建立一個新地圖,但不包含任何null
值。
對於現有的映射中鍵值對中已經null
值,我們可以使用filter()
方法:
@Test
void givenMapWithNullValue_whenUsingStreamFilter_thenObtainMapWithNonNullValues() {
final Map<Integer, String> nullValueMap = new HashMap<>();
nullValueMap.put(1, value);
final Map<Integer, String> mapWithoutNullValues = nullValueMap
.entrySet()
.stream()
.filter(entry -> Objects.nonNull(entry.getValue()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
assertThat(mapWithoutNullValues).isEmpty();
}
首先,我們透過呼叫entrySet()
傳回的Set<Map.Entry>
上的stream()
方法來取得映射條目stream
。接下來,我們使用filter()
方法根據提供的謂詞從流中刪除元素。如果映射條目的值為null
,則謂詞傳回true
。我們使用Objects.nonNull()
方法的方法參考來執行此操作。
然而,我們可以使用替代謂詞來實現相同的效果。例如,我們可以使用if
語句作為 lambda 表達式的一部分:
.filter(entry -> {
if(entry.getValue() != null)
return true;
else
return false;
})
或者,我們可以使用Optional
類別的isPresent()
方法:
.filter(entry -> Optional.ofNullable(entry.getValue()).isPresent())
無論如何,我們將過濾後的元素收集到新的映射中,確保沒有null
值。
5. 結論
在本文中,我們探討了使用put()
方法避免在映射中插入null
值的不同方法。需要注意的是,為了確保映射永遠不會null
值,必須考慮將鍵值插入映射的其他方法。例如,使用具體Map
類別的建構子和方法(如putAll().
與往常一樣,本文中使用的程式碼範例可在 GitHub 上找到。