Java合并集合幾種常見方式總結(jié)(List、Set、Map)
更新時間:2025年03月19日 10:24:47 作者:頭孢頭孢
這篇文章主要介紹了Java中合并List、Set、Map的多種方法,包括addAll()、Stream.concat()、Stream.of()+flatMap()、List.copyOf()、putAll()、merge()、compute()和StreamAPI等,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
Java 提供了多種方式來合并集合(List、Set、Map),不同場景下可選擇最合適的方法。以下是常見的合并集合方式的整理:
1. 合并 List
1.1 addAll()
- 適用場景:直接合并兩個 List
- 特點:修改原集合,無需創(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()
- 適用場景:不修改原集合,返回新 List
- 特點:流式操作,適用于不可變集合
- 示例:
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()
- 適用場景:合并多個 List
- 特點:可同時合并多個 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()
- 適用場景:創(chuàng)建不可變 List
- 特點:返回 不可變 集合
- 示例:
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()
- 適用場景:合并 Set(無重復元素)
- 示例:
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()
- 適用場景:不修改原集合
- 示例:
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()
- 適用場景:合并多個 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()
- 適用場景:直接合并 Map
- 特點:如果 key 存在,后者會覆蓋前者
- 示例:
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()
- 適用場景:合并時處理重復 key
- 特點:可指定 key 處理方式
- 示例:
map2.forEach((key, value) -> map1.merge(key, value, Integer::sum) ); System.out.println(map1); // {A=1, B=5, C=4}
3.3 compute()
- 適用場景:動態(tài)計算 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
- 適用場景:不修改原 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) | 方法 | 適用場景 | 是否修改原集合 |
---|---|---|---|
List | addAll() | 直接合并 | ? |
Stream.concat() | 不修改原 List | ? | |
Stream.of() + flatMap() | 合并多個 List | ? | |
List.copyOf() | 創(chuàng)建不可變 List | ? | |
Set | addAll() | 直接合并 | ? |
Stream.concat() | 不修改原 Set | ? | |
Stream.of() + flatMap() | 合并多個 Set | ? | |
Map | putAll() | 后者覆蓋前者 | ? |
merge() | 合并相同 key | ? | |
compute() | 計算 key 值 | ? | |
Stream API | 不修改原 Map | ? |
- ? 修改原集合:適用于直接更新已有集合的場景。
- ? 不修改原集合:適用于函數(shù)式編程、不可變集合的場景。
這幾種方式適用于不同的開發(fā)需求,具體選擇哪種方法取決于業(yè)務邏輯和性能要求。
到此這篇關于Java合并集合幾種常見方式總結(jié)(List、Set、Map)的文章就介紹到這了,更多相關Java合并集合方式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解Java中super的幾種用法并與this的區(qū)別
這篇文章主要介紹了Java中super的幾種用法并與this的區(qū)別,有需要的朋友可以參考一下2013-12-12Java實現(xiàn)對兩個List快速去重并排序操作示例
這篇文章主要介紹了Java實現(xiàn)對兩個List快速去重并排序操作,結(jié)合實例形式較為詳細的分析了Java針對list的遍歷、去重、排序相關操作技巧與注意事項,需要的朋友可以參考下2018-07-07Java實現(xiàn)單鏈表SingleLinkedList增刪改查及反轉(zhuǎn) 逆序等
單鏈表是鏈表的其中一種基本結(jié)構(gòu)。一個最簡單的結(jié)點結(jié)構(gòu)如圖所示,它是構(gòu)成單鏈表的基本結(jié)點結(jié)構(gòu)。在結(jié)點中數(shù)據(jù)域用來存儲數(shù)據(jù)元素,指針域用于指向下一個具有相同結(jié)構(gòu)的結(jié)點。 因為只有一個指針結(jié)點,稱為單鏈表2021-10-10idea啟動報錯:Command line is too long問題
在使用IDEA時,若遇到"Commandlineistoolong"錯誤,通常是因為命令行長度超限,這是因為IDEA通過命令行或文件將classpath傳遞至JVM,操作系統(tǒng)對命令行長度有限制,解決方法是切換至動態(tài)類路徑,通過修改項目的workspace.xml文件2024-09-09