Java合并集合幾種常見(jiàn)方式總結(jié)(List、Set、Map)
Java 提供了多種方式來(lái)合并集合(List、Set、Map),不同場(chǎng)景下可選擇最合適的方法。以下是常見(jiàn)的合并集合方式的整理:
1. 合并 List
1.1 addAll()
- 適用場(chǎng)景:直接合并兩個(gè) List
- 特點(diǎn):修改原集合,無(wú)需創(chuàng)建新集合
- 示例:
List<String> list1 = new ArrayList<>(Arrays.asList("A", "B", "C"));
List<String> list2 = Arrays.asList("D", "E");
list1.addAll(list2);
System.out.println(list1); // [A, B, C, D, E]
1.2 Stream.concat()
- 適用場(chǎng)景:不修改原集合,返回新 List
- 特點(diǎn):流式操作,適用于不可變集合
- 示例:
List<String> mergedList = Stream.concat(list1.stream(), list2.stream())
.collect(Collectors.toList());
System.out.println(mergedList); // [A, B, C, D, E]
1.3 Stream.of() + flatMap()
- 適用場(chǎng)景:合并多個(gè) List
- 特點(diǎn):可同時(shí)合并多個(gè) List
- 示例:
List<String> list3 = Arrays.asList("F", "G");
List<String> mergedList = Stream.of(list1, list2, list3)
.flatMap(Collection::stream)
.collect(Collectors.toList());
System.out.println(mergedList); // [A, B, C, D, E, F, G]
1.4 List.copyOf()
- 適用場(chǎng)景:創(chuàng)建不可變 List
- 特點(diǎn):返回 不可變 集合
- 示例:
List<String> mergedList = List.copyOf(Stream.concat(list1.stream(), list2.stream())
.collect(Collectors.toList()));
System.out.println(mergedList); // [A, B, C, D, E]
2. 合并 Set
2.1 addAll()
- 適用場(chǎng)景:合并 Set(無(wú)重復(fù)元素)
- 示例:
Set<Integer> set1 = new HashSet<>(Arrays.asList(1, 2, 3)); Set<Integer> set2 = new HashSet<>(Arrays.asList(3, 4, 5)); set1.addAll(set2); System.out.println(set1); // [1, 2, 3, 4, 5]
2.2 Stream.concat()
- 適用場(chǎng)景:不修改原集合
- 示例:
Set<Integer> mergedSet = Stream.concat(set1.stream(), set2.stream())
.collect(Collectors.toSet());
System.out.println(mergedSet); // [1, 2, 3, 4, 5]
2.3 Stream.of() + flatMap()
- 適用場(chǎng)景:合并多個(gè) Set
- 示例:
Set<Integer> set3 = new HashSet<>(Arrays.asList(6, 7));
Set<Integer> mergedSet = Stream.of(set1, set2, set3)
.flatMap(Set::stream)
.collect(Collectors.toSet());
System.out.println(mergedSet); // [1, 2, 3, 4, 5, 6, 7]
3. 合并 Map
3.1 putAll()
- 適用場(chǎng)景:直接合并 Map
- 特點(diǎn):如果 key 存在,后者會(huì)覆蓋前者
- 示例:
Map<String, Integer> map1 = new HashMap<>();
map1.put("A", 1);
map1.put("B", 2);
Map<String, Integer> map2 = new HashMap<>();
map2.put("B", 3);
map2.put("C", 4);
map1.putAll(map2);
System.out.println(map1); // {A=1, B=3, C=4}
3.2 merge()
- 適用場(chǎng)景:合并時(shí)處理重復(fù) key
- 特點(diǎn):可指定 key 處理方式
- 示例:
map2.forEach((key, value) ->
map1.merge(key, value, Integer::sum)
);
System.out.println(map1); // {A=1, B=5, C=4}
3.3 compute()
- 適用場(chǎng)景:動(dòng)態(tài)計(jì)算 key
- 示例:
map2.forEach((key, value) ->
map1.compute(key, (k, v) -> (v == null) ? value : v + value)
);
System.out.println(map1); // {A=1, B=5, C=4}
3.4 Stream API
- 適用場(chǎng)景:不修改原 Map,生成新 Map
- 示例:
Map<String, Integer> mergedMap = Stream.of(map1, map2)
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
Integer::sum));
System.out.println(mergedMap); // {A=1, B=5, C=4}
4. 總結(jié)
| 數(shù)據(jù)結(jié)構(gòu) | 方法 | 適用場(chǎng)景 | 是否修改原集合 |
|---|---|---|---|
| List | addAll() | 直接合并 | ? |
Stream.concat() | 不修改原 List | ? | |
Stream.of() + flatMap() | 合并多個(gè) List | ? | |
List.copyOf() | 創(chuàng)建不可變 List | ? | |
| Set | addAll() | 直接合并 | ? |
Stream.concat() | 不修改原 Set | ? | |
Stream.of() + flatMap() | 合并多個(gè) Set | ? | |
| Map | putAll() | 后者覆蓋前者 | ? |
merge() | 合并相同 key | ? | |
compute() | 計(jì)算 key 值 | ? | |
Stream API | 不修改原 Map | ? |
- ? 修改原集合:適用于直接更新已有集合的場(chǎng)景。
- ? 不修改原集合:適用于函數(shù)式編程、不可變集合的場(chǎng)景。
這幾種方式適用于不同的開(kāi)發(fā)需求,具體選擇哪種方法取決于業(yè)務(wù)邏輯和性能要求。
到此這篇關(guān)于Java合并集合幾種常見(jiàn)方式總結(jié)(List、Set、Map)的文章就介紹到這了,更多相關(guān)Java合并集合方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot如何化長(zhǎng)輪詢連接頻繁建立銷毀問(wèn)題
長(zhǎng)輪詢(Long Polling)是一種經(jīng)典的 HTTP 輪詢機(jī)制,本文將結(jié)合 Spring Boot,從異步處理、連接復(fù)用、客戶端優(yōu)化等角度出發(fā),詳細(xì)講解如何優(yōu)化長(zhǎng)輪詢機(jī)制,有需要的可以了解下2025-07-07
SpringBoot+JavaMailSender實(shí)現(xiàn)騰訊企業(yè)郵箱配置
這篇文章主要介紹了SpringBoot+JavaMailSender實(shí)現(xiàn)騰訊企業(yè)郵箱配置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
實(shí)例講解Java的設(shè)計(jì)模式編程中責(zé)任鏈模式的運(yùn)用
這篇文章主要介紹了Java的設(shè)計(jì)模式編程中責(zé)任鏈模式的運(yùn)用,講解了通過(guò)條件判斷結(jié)構(gòu)來(lái)分配不同對(duì)象的責(zé)任權(quán)限,需要的朋友可以參考下2016-02-02
Springboot使用Websocket的時(shí)候調(diào)取IOC管理的Bean報(bào)空指針異常問(wèn)題
這篇文章主要介紹了Springboot使用Websocket的時(shí)候調(diào)取IOC管理的Bean報(bào)空指針異常問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-05-05
skywalking源碼解析javaAgent工具ByteBuddy應(yīng)用
這篇文章主要為大家介紹了skywalking源碼解析javaAgent工具ByteBuddy應(yīng)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-03-03
Java項(xiàng)目開(kāi)發(fā)中ThreadLocal的6大用法總結(jié)
ThreadLocal在項(xiàng)目中非常常用,本文整理了Java項(xiàng)目開(kāi)發(fā)中ThreadLocal的6大常見(jiàn)用法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2026-01-01
Maven重復(fù)依賴問(wèn)題解決(同一個(gè)jar多個(gè)版本)
本文主要介紹了Maven重復(fù)依賴問(wèn)題解決(同一個(gè)jar多個(gè)版本),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06

