在Java中,Collectors 类是 Java Stream API 的一部分,它位于 java.util.stream.Collectors 包中。Collectors 类提供了许多有用的收集器(Collector),这些收集器可以在流操作(如 map(), filter(), reduce() 等)之后使用,以将流中的元素累积到集合(如 List, Set, Map 等)或其他数据结构中。
Collectors 类提供了一系列静态工厂方法来创建不同类型的收集器,包括:
转换为集合:如 toList(), toSet(), toCollection() 等。 汇总操作:如 summingInt(), averagingDouble(), counting(), maxBy(), minBy() 等。 分组操作:如 groupingBy(), partitioningBy() 等。 连接操作:如 joining()(用于字符串)。 映射操作:如 mapping()(结合其他收集器)。
以下是一些 Collectors 类的常见用法示例:
将流中的元素收集到列表中:
List<String> list = Arrays.asList("a", "b", "c");
List<String> collectedList = list.stream().collect(Collectors.toList());
计算流中元素的数量:
long count = list.stream().collect(Collectors.counting());
将流中的元素分组到Map中:
Map<Character, List<String>> groupedByFirstChar = list.stream()
.collect(Collectors.groupingBy(s -> s.charAt(0)));
对流中的元素进行过滤和求和:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
int sum = numbers.stream()
.filter(n -> n % 2 == 0) // 过滤偶数
.mapToInt(Integer::intValue) // 转换为int流
.sum(); // 求和
// 使用Collectors.summingInt
int sumUsingCollectors = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.summingInt(Integer::intValue));
连接字符串流中的元素:
List<String> words = Arrays.asList("Hello", "world", "!");
String sentence = words.stream()
.collect(Collectors.joining(" ")); // 使用空格连接
转换Map:toMap
解释
Map<String, Integer> yguiMap = listCAndNum.stream()
.collect(Collectors.toMap( AutoArchiveRuleConfig::getClassification,
config -> {String collectStationNum = config.getCollectStationNum();
if (collectStationNum == null || collectStationNum.isEmpty()) {//返回一个默认值 return 0;}
// 如果dayOrMonth为"day",则直接返回parseInt的结果
// 否则,返回parseInt的结果乘以day
return "day".equals(dayOrMonth) ? Integer.parseInt(collectStationNum) : Integer.parseInt(collectStationNum) * day; },
// 如果键冲突,指定一个合并函数(这里简单地使用后面的值覆盖前面的值)
(oldValue, newValue) -> newValue,
LinkedHashMap::new // 保持插入顺序(如果需要的话) ));
请注意,我还添加了一个合并函数 (oldValue, newValue) -> newValue
,这是 Collectors.toMap
的一个可选参数。在多个元素映射到相同的键时,合并函数会被调用以决定新值和旧值应该如何合并。在这个例子中,我简单地选择了新值来覆盖旧值。
此外,我添加了 LinkedHashMap::new
作为 Collectors.toMap
的最后一个参数,以确保结果 Map
保持插入顺序(如果这是您所期望的)。如果您不关心顺序,可以省略这个参数。
自定义收集器:
Collectors 类也提供了 Collector 接口的实现工具,如 Collector.of(),允许你创建自定义的收集器。
使用 Collectors 类可以极大地简化流操作的结果收集过程,并使得代码更加简洁和易读。