在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());
  • 1.
  • 2.

计算流中元素的数量:

long count = list.stream().collect(Collectors.counting());
  • 1.

将流中的元素分组到Map中:

Map<Character, List<String>> groupedByFirstChar = list.stream()
    .collect(Collectors.groupingBy(s -> s.charAt(0)));
  • 1.
  • 2.

对流中的元素进行过滤和求和:

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));
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

连接字符串流中的元素:

List<String> words = Arrays.asList("Hello", "world", "!");
String sentence = words.stream()
    .collect(Collectors.joining(" ")); // 使用空格连接
  • 1.
  • 2.
  • 3.

转换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 // 保持插入顺序(如果需要的话)    ));
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

请注意,我还添加了一个合并函数 (oldValue, newValue) -> newValue,这是 Collectors.toMap 的一个可选参数。在多个元素映射到相同的键时,合并函数会被调用以决定新值和旧值应该如何合并。在这个例子中,我简单地选择了新值来覆盖旧值。

此外,我添加了 LinkedHashMap::new 作为 Collectors.toMap 的最后一个参数,以确保结果 Map 保持插入顺序(如果这是您所期望的)。如果您不关心顺序,可以省略这个参数。

自定义收集器:

Collectors 类也提供了 Collector 接口的实现工具,如 Collector.of(),允许你创建自定义的收集器。

使用 Collectors 类可以极大地简化流操作的结果收集过程,并使得代码更加简洁和易读。