Collectors.groupingBy

Collectors.groupingBy

Collectors类 groupingBy 方法

package java.util.stream;

public final class Collectors {
    
    public static  Collector>>
    groupingBy(Function classifier) {
        return groupingBy(classifier, toList());
    }
    
    public static 
    Collector> groupingBy(Function classifier,
                                          Collector downstream) {
        return groupingBy(classifier, HashMap::new, downstream);
    }
    
    public static >
    Collector groupingBy(Function classifier,
                                  Supplier mapFactory,
                                  Collector downstream) {
        Supplier downstreamSupplier = downstream.supplier();
        BiConsumer downstreamAccumulator = downstream.accumulator();
        BiConsumer, T> accumulator = (m, t) -> {
            K key = Objects.requireNonNull(classifier.apply(t), "element cannot be mapped to a null key");
            A container = m.computeIfAbsent(key, k -> downstreamSupplier.get());
            downstreamAccumulator.accept(container, t);
        };
        BinaryOperator> merger = Collectors.>mapMerger(downstream.combiner());
        @SuppressWarnings("unchecked")
        Supplier> mangledFactory = (Supplier>) mapFactory;

        if (downstream.characteristics().contains(Collector.Characteristics.IDENTITY_FINISH)) {
            return new CollectorImpl<>(mangledFactory, accumulator, merger, CH_ID);
        }
        else {
            @SuppressWarnings("unchecked")
            Function downstreamFinisher = (Function) downstream.finisher();
            Function, M> finisher = intermediate -> {
                intermediate.replaceAll((k, v) -> downstreamFinisher.apply(v));
                @SuppressWarnings("unchecked")
                M castResult = (M) intermediate;
                return castResult;
            };
            return new CollectorImpl<>(mangledFactory, accumulator, merger, finisher, CH_NOID);
        }
    }
}

  1. 一个参数的方法

    一个参数的方法,还是调用的两个参数的重载方法,第二个参数默认调用 toList() 方法

    public static  Collector>>
        groupingBy(Function classifier) {
            return groupingBy(classifier, toList());
    

}


示例:

```java
public class Student {

    private Long id;
    private String name;
    private Integer age;
    private String address;
}

public class GroupingByTest {

    public static void main(String[] args) {
        List students = new ArrayList<>();
        Student student = new Student();
        student.setId(1L);
        student.setName("小明");
        students.add(student);
        Student student2 = new Student();
        student2.setId(2L);
        student2.setName("小红");
        students.add(student2);
        Map> collect = students.stream().collect(Collectors.groupingBy(s -> {
            return s.getId();
        }));
        System.out.println(JSON.toJSONString(collect));
    }
}

结果

{1:[{"id":1,"name":"小明"}],2:[{"id":2,"name":"小红"}]}

groupingBy 方法参数Function classifier

@FunctionalInterface
public interface Function {
    R apply(T t);
}

Function是函数式接口,接收一个参数T,返回一个结果R,示例中可以表示为下面这样的,先创建一个Function接口,再将接口当作参数传进去.

Function groupingByFun = s -> {return s.getId()};
        Map> collect = students.stream().collect(Collectors.groupingBy(groupingByFun
        ));

优化s -> {return s.getId()} 可以简化写法

Function groupingByFun = s -> {return s.getId()};
// 可以简化成
Function groupingByFun = s ->  s.getId();
// 再一次简化
Function groupingByFun = Student::getId;
  1. 两个参数的方法

    public static 
        Collector> groupingBy(Function classifier,
                                              Collector downstream) {
            return groupingBy(classifier, HashMap::new, downstream);
        }
    

    示例

    Map countMap = students.stream().collect(Collectors.groupingBy(Student::getId, Collectors.counting()));
            System.out.println(JSON.toJSONString(countMap));
    
    // {1:1,2:1}
    
  1. 三个参数的方法

    public static >
        Collector groupingBy(Function classifier,
                                      Supplier mapFactory,
                                      Collector downstream) {
        
    }
    

    示例

    TreeMap> treeMapSet = students.stream().collect(Collectors.groupingBy(Student::getId, TreeMap::new, Collectors.toSet()));
    
    System.out.println(JSON.toJSONString(treeMapSet));
    // {1:[{"id":1,"name":"小明"}],2:[{"id":2,"name":"小红"}]}
    

本篇文章由一文多发平台ArtiPub自动发布

你可能感兴趣的:(Collectors.groupingBy)