java的collect方法是stream api中的終結操作,用于將流元素收集到指定數(shù)據(jù)結構中。其核心在于supplier、accumulator和combiner三個參數(shù):1.supplier創(chuàng)建結果容器;2.accumulator將元素添加到容器;3.combiner合并多個容器結果。常用collectors類簡化操作,如tolist收集到list,toset去重收集到set,tomap構建映射,groupingby按條件分組(可嵌套下游收集器),joining連接字符串(支持分隔符、前綴、后綴),reducing執(zhí)行聚合計算(如求和)。掌握這些用法可高效處理集合數(shù)據(jù)。
Java的collect方法是Stream API中的一個終結操作,它允許你將流中的元素收集到一個集合、列表、映射或者任何其他你想要的數(shù)據(jù)結構中。簡單來說,它就是把流水線上的東西打包帶走,裝進你指定的容器里。
解決方案
collect方法的核心在于它的三個參數(shù):Supplier, Accumulator, 和 Combiner。
立即學習“Java免費學習筆記(深入)”;
但大多數(shù)時候,我們不需要自己手動實現(xiàn)這三個參數(shù),而是使用Collectors類提供的靜態(tài)方法,它們已經(jīng)封裝好了常用的收集邏輯。
例如,將流收集到一個List:
List<String> names = Stream.of("Alice", "Bob", "Charlie") .collect(Collectors.toList()); System.out.println(names); // 輸出: [Alice, Bob, Charlie]
收集到一個Set:
Set<String> uniqueNames = Stream.of("Alice", "Bob", "Alice", "Charlie") .collect(Collectors.toSet()); System.out.println(uniqueNames); // 輸出: [Alice, Bob, Charlie] (順序可能不同)
收集到一個Map(需要指定key和value的映射):
Map<String, Integer> nameLengths = Stream.of("Alice", "Bob", "Charlie") .collect(Collectors.toMap( name -> name, // key name -> name.length() // value )); System.out.println(nameLengths); // 輸出: {Alice=5, Bob=3, Charlie=7}
如何使用groupingBy進行分組?
groupingBy是Collectors中非常強大的一個方法,它允許你根據(jù)某個條件將流中的元素分組到不同的集合中。 可以理解為把流水線上的產(chǎn)品按照型號分別裝到不同的箱子里。
例如,按照字符串長度分組:
Map<Integer, List<String>> namesByLength = Stream.of("Alice", "Bob", "Charlie", "Dave") .collect(Collectors.groupingBy(String::length)); System.out.println(namesByLength); // 輸出: {3=[Bob, Dave], 5=[Alice], 7=[Charlie]}
如果還想對每個分組的結果進行進一步的處理,可以使用groupingBy的第二個參數(shù),它接受另一個Collector作為下游收集器。 比如,計算每個長度的字符串的數(shù)量:
Map<Integer, Long> nameCountByLength = Stream.of("Alice", "Bob", "Charlie", "Dave") .collect(Collectors.groupingBy( String::length, Collectors.counting() )); System.out.println(nameCountByLength); // 輸出: {3=2, 5=1, 7=1}
joining方法有什么用?
joining方法用于將流中的字符串元素連接成一個字符串。 它接受三個可選參數(shù):分隔符、前綴和后綴。
String joinedNames = Stream.of("Alice", "Bob", "Charlie") .collect(Collectors.joining(", ")); System.out.println(joinedNames); // 輸出: Alice, Bob, Charlie
加入前綴和后綴:
String joinedNamesWithPrefixSuffix = Stream.of("Alice", "Bob", "Charlie") .collect(Collectors.joining(", ", "[", "]")); System.out.println(joinedNamesWithPrefixSuffix); // 輸出: [Alice, Bob, Charlie]
如何使用reducing進行聚合計算?
reducing方法用于對流中的元素進行聚合計算,比如求和、求平均值等。 它接受三個參數(shù):初始值、累加器和組合器。
例如,計算所有字符串的長度之和:
Integer totalLength = Stream.of("Alice", "Bob", "Charlie") .collect(Collectors.reducing( 0, // 初始值 String::length, // 累加器 (將字符串轉(zhuǎn)換為長度) Integer::sum // 組合器 (將兩個長度相加) )); System.out.println(totalLength); // 輸出: 15
reducing還有更簡潔的重載形式,可以直接傳入一個二元操作符:
Optional<Integer> sum = Stream.of(1, 2, 3, 4, 5) .collect(Collectors.reducing(Integer::sum)); System.out.println(sum.orElse(0)); // 輸出: 15
注意這里返回的是Optional
collect方法是Java Stream API中一個非常靈活和強大的工具,掌握它可以讓你更高效地處理集合數(shù)據(jù)。雖然一開始可能覺得參數(shù)有點多,但多用幾次就熟練了。
以上就是Java中collect方法怎么用 掌握流結果收集的各種方式的詳細內(nèi)容,更多請關注php中文網(wǎng)其它相關文章!
每個人都需要一臺速度更快、更穩(wěn)定的 PC。隨著時間的推移,垃圾文件、舊注冊表數(shù)據(jù)和不必要的后臺進程會占用資源并降低性能。幸運的是,許多工具可以讓 Windows 保持平穩(wěn)運行。
Copyright 2014-2025 http://m.miracleart.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號