最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java8合并兩個(gè)Map中元素的正確姿勢

 更新時(shí)間:2020年09月02日 10:19:55   作者:明明如月學(xué)長  
這篇文章主要介紹了詳解Java8合并兩個(gè)Map中元素的正確姿勢,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

 1. 介紹

本入門教程將介紹Java8中如何合并兩個(gè)map。

更具體說來,我們將研究不同的合并方案,包括Map含有重復(fù)元素的情況。

2. 初始化

我們定義兩個(gè)map實(shí)例

private static Map<String, Employee> map1 = new HashMap<>();
private static Map<String, Employee> map2 = new HashMap<>();

Employee類

public class Employee {
 
 private Long id;
 private String name;
 
 // 此處省略構(gòu)造方法, getters, setters方法
}

然后往map中存入一些數(shù)據(jù)

Employee employee1 = new Employee(1L, "Henry");
map1.put(employee1.getName(), employee1);
Employee employee2 = new Employee(22L, "Annie");
map1.put(employee2.getName(), employee2);
Employee employee3 = new Employee(8L, "John");
map1.put(employee3.getName(), employee3);
 
Employee employee4 = new Employee(2L, "George");
map2.put(employee4.getName(), employee4);
Employee employee5 = new Employee(3L, "Henry");
map2.put(employee5.getName(), employee5);

特別需要注意的是employee1 和 employee5在map中有完全相同的key(name)。

3. Map.merge()

Java8為 java.util.Map接口新增了merge()函數(shù)。

 merge()  函數(shù)的作用是: 如果給定的key之前沒設(shè)置value 或者value為null, 則將給定的value關(guān)聯(lián)到這個(gè)key上.

否則,通過給定的remaping函數(shù)計(jì)算的結(jié)果來替換其value。如果remapping函數(shù)的計(jì)算結(jié)果為null,將解除此結(jié)果。

First, let's construct a new HashMap by copying all the entries from the map1:

首先,我們通過拷貝map1中的元素來構(gòu)造一個(gè)新的HashMap

Map<String, Employee> map3 = new HashMap<>(map1);

然后引入merge函數(shù)和合并規(guī)則

map3.merge(key, value, (v1, v2) -> new Employee(v1.getId(),v2.getName())

最后對map2進(jìn)行迭代將其元素合并到map3中

map2.forEach(
 (key, value) -> map3.merge(key, value, (v1, v2) -> new Employee(v1.getId(),v2.getName())));

運(yùn)行程序并打印結(jié)果如下:

John=Employee{id=8, name='John'}
Annie=Employee{id=22, name='Annie'}
George=Employee{id=2, name='George'}
Henry=Employee{id=1, name='Henry'}

最終,通過結(jié)果可以看出,實(shí)現(xiàn)了兩個(gè)map的合并,對重復(fù)的key也合并為同一個(gè)元素。

注意最后一個(gè)Employee的id來自map1而name來自map2.

原因是我們的merge函數(shù)的定義

(v1, v2) -> new Employee(v1.getId(), v2.getName())

4. Stream.concat()

Java8的Stream API 也為解決該問題提供了較好的解決方案。

首先需要將兩個(gè)map合為一個(gè)Stream。

Stream combined = Stream.concat(map1.entrySet().stream(), map2.entrySet().stream());

我們需要將entry sets作為參數(shù),然后利用Collectors.toMap():將結(jié)果放到新的map中。

Map<String, Employee> result = combined.collect(
 Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

該方法可以實(shí)現(xiàn)map的合并,但是有重復(fù)key會(huì)報(bào)IllegalStateException異常。

為了解決這個(gè)問題,我們需要加入lambda表達(dá)式merger作為第三個(gè)參數(shù)

(value1, value2) -> new Employee(value2.getId(), value1.getName())

當(dāng)檢測到有重復(fù)Key時(shí)就會(huì)用到該lambda表達(dá)式。

現(xiàn)在把上面代碼組合在一起:

Map<String, Employee> result = Stream.concat(map1.entrySet().stream(), map2.entrySet().stream())
 .collect(Collectors.toMap(
 Map.Entry::getKey, 
 Map.Entry::getValue,
 (value1, value2) -> new Employee(value2.getId(), value1.getName())));

最終的結(jié)果

George=Employee{id=2, name='George'}
John=Employee{id=8, name='John'}
Annie=Employee{id=22, name='Annie'}
Henry=Employee{id=3, name='Henry'}

從結(jié)果可以看出重復(fù)的key “Henry”將合并為一個(gè)新的鍵值對,id取自map2,name取自map1。

5. Stream.of()

通過Stream.of()方法不需要借助其他stream就可以實(shí)現(xiàn)map的合并。

Map<String, Employee> map3 = Stream.of(map1, map2)
 .flatMap(map -> map.entrySet().stream())
 .collect(Collectors.toMap(
 Map.Entry::getKey,
 Map.Entry::getValue,
 (v1, v2) -> new Employee(v1.getId(), v2.getName())));

首先將map1和map2的元素合并為同一個(gè)流,然后再轉(zhuǎn)成map。通過使用v1的id和v2的name來解決重復(fù)key的問題。

map3的運(yùn)行打印結(jié)果如下:

6. Simple Streaming

我們還可以借助stream的管道操作來實(shí)現(xiàn)map合并。

Map<String, Employee> map3 = map2.entrySet()
 .stream()
 .collect(Collectors.toMap(
 Map.Entry::getKey,
 Map.Entry::getValue,
 (v1, v2) -> new Employee(v1.getId(), v2.getName()),
 () -> new HashMap<>(map1)));

結(jié)果如下:

{John=Employee{id=8, name='John'},
Annie=Employee{id=22, name='Annie'},
George=Employee{id=2, name='George'},
Henry=Employee{id=1, name='Henry'}}

7. StreamEx

我們還可以使Stream API 的增強(qiáng)庫

Map<String, Employee> map3 = EntryStream.of(map1)
 .append(EntryStream.of(map2))
 .toMap((e1, e2) -> e1);

注意 (e1, e2) -> e1 表達(dá)式來處理重復(fù)key的問題,如果沒有該表達(dá)式依然會(huì)報(bào)IllegalStateException異常。

結(jié)果:

{George=Employee{id=2, name='George'},
John=Employee{id=8, name='John'},
Annie=Employee{id=22, name='Annie'},
Henry=Employee{id=1, name='Henry'}}

8 總結(jié)

本文使用了Map.merge(), Stream API, StreamEx 庫實(shí)現(xiàn)map的合并。

英文原文地址:https://www.baeldung.com/java-merge-maps

到此這篇關(guān)于詳解Java8合并兩個(gè)Map中元素的正確姿勢的文章就介紹到這了,更多相關(guān)Java8合并Map中元素內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot開發(fā)中使用DTO層的方法示例

    SpringBoot開發(fā)中使用DTO層的方法示例

    DTO層是在應(yīng)用程序的業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層之間引入的一個(gè)中間層,用于在不同層之間傳輸數(shù)據(jù),本文主要介紹了SpringBoot開發(fā)中使用DTO層,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • 淺談線程通信wait,notify作用

    淺談線程通信wait,notify作用

    這篇文章主要介紹了淺談線程通信wait,notify作用,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2017-12-12
  • 使用SpringJPA?直接實(shí)現(xiàn)count(*)

    使用SpringJPA?直接實(shí)現(xiàn)count(*)

    這篇文章主要介紹了SpringJPA?直接實(shí)現(xiàn)count(*),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 詳解Java基礎(chǔ)之封裝

    詳解Java基礎(chǔ)之封裝

    這篇文章主要為大家介紹了Java基礎(chǔ)之封裝,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • 使用jdk7的nio2操作文件拷貝和剪切示例

    使用jdk7的nio2操作文件拷貝和剪切示例

    使用jdk7的NIO2進(jìn)行文件或文件夾的拷貝移動(dòng)操作。可以自動(dòng)創(chuàng)建路徑,差異化更新文件,簡單的出錯(cuò)重連機(jī)制
    2014-01-01
  • Maven重復(fù)依賴問題解決(同一個(gè)jar多個(gè)版本)

    Maven重復(fù)依賴問題解決(同一個(gè)jar多個(gè)版本)

    本文主要介紹了Maven重復(fù)依賴問題解決(同一個(gè)jar多個(gè)版本),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Java實(shí)現(xiàn)快速排序算法可視化的示例代碼

    Java實(shí)現(xiàn)快速排序算法可視化的示例代碼

    快速排序算法通過多次比較和交換來實(shí)現(xiàn)排序,是對冒泡排序算法的一種改進(jìn)。本文將用Java語言實(shí)現(xiàn)快速排序算法并進(jìn)行可視化,感興趣的可以了解一下
    2022-08-08
  • Java導(dǎo)入、導(dǎo)出excel用法步驟保姆級教程(附封裝好的工具類)

    Java導(dǎo)入、導(dǎo)出excel用法步驟保姆級教程(附封裝好的工具類)

    這篇文章主要介紹了Java導(dǎo)入、導(dǎo)出excel的相關(guān)資料,講解了使用Java和ApachePOI庫將數(shù)據(jù)導(dǎo)出為Excel文件,包括創(chuàng)建工作簿、工作表、行和單元格,設(shè)置樣式和字體,合并單元格,添加公式和下拉選擇等功能,需要的朋友可以參考下
    2025-03-03
  • Spring??AOP的兩種使用方法

    Spring??AOP的兩種使用方法

    這篇文章主要介紹了Spring?AOP的兩種使用方法,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • Java?Request獲取請求頭數(shù)據(jù)實(shí)例詳解

    Java?Request獲取請求頭數(shù)據(jù)實(shí)例詳解

    在開發(fā)中我們經(jīng)常需要獲取用戶IP地址,通過地址來實(shí)現(xiàn)一些功能,下面這篇文章主要給大家介紹了關(guān)于Java中Request獲取請求頭數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2024-01-01

最新評論

鄂托克前旗| 区。| 文安县| 古浪县| 石渠县| 安新县| 山东省| 镇平县| 达州市| 南宫市| 克东县| 焦作市| 巫溪县| 延川县| 同德县| 肇州县| 遵化市| 邯郸市| 华池县| 兰西县| 江西省| 秦皇岛市| 明光市| 论坛| 巴东县| 荆门市| 十堰市| 广汉市| 小金县| 那坡县| 全州县| 桐庐县| 沈阳市| 石门县| 建昌县| 洛扎县| 肇源县| 防城港市| 唐山市| 雷山县| 锡林浩特市|