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

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

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

 1. 介紹

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

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

2. 初始化

我們定義兩個map實例

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)到這個key上.

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

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

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

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

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

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

最后對map2進行迭代將其元素合并到map3中

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

運行程序并打印結(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é)果可以看出,實現(xiàn)了兩個map的合并,對重復(fù)的key也合并為同一個元素。

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

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

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

4. Stream.concat()

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

首先需要將兩個map合為一個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));

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

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

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

當(dāng)檢測到有重復(fù)Key時就會用到該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”將合并為一個新的鍵值對,id取自map2,name取自map1。

5. Stream.of()

通過Stream.of()方法不需要借助其他stream就可以實現(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的元素合并為同一個流,然后再轉(zhuǎn)成map。通過使用v1的id和v2的name來解決重復(fù)key的問題。

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

6. Simple Streaming

我們還可以借助stream的管道操作來實現(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 的增強庫

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

注意 (e1, e2) -> e1 表達(dá)式來處理重復(fù)key的問題,如果沒有該表達(dá)式依然會報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 庫實現(xiàn)map的合并。

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

到此這篇關(guān)于詳解Java8合并兩個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ù)訪問層之間引入的一個中間層,用于在不同層之間傳輸數(shù)據(jù),本文主要介紹了SpringBoot開發(fā)中使用DTO層,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • 淺談線程通信wait,notify作用

    淺談線程通信wait,notify作用

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

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

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

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

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

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

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

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

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

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

    快速排序算法通過多次比較和交換來實現(xiàn)排序,是對冒泡排序算法的一種改進。本文將用Java語言實現(xià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)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • Java?Request獲取請求頭數(shù)據(jù)實例詳解

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

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

最新評論

河源市| 广汉市| 马尔康县| 蒙山县| 高邮市| 洪湖市| 二连浩特市| 广饶县| 白玉县| 吕梁市| 仙居县| 沈丘县| 罗田县| 老河口市| 措勤县| 灵寿县| 海淀区| 鹤岗市| 新竹县| 陇西县| 黄平县| 三亚市| 佳木斯市| 保德县| 神木县| 竹北市| 汨罗市| 闵行区| 西宁市| 南昌市| 石泉县| 七台河市| 车致| 金昌市| 无锡市| 水城县| 吉林省| 莱阳市| 合川市| 阳城县| 黄石市|