Java8 Stream 之groupingBy 分组讲解

本文主要讲解:Java 8 Stream之Collectors.groupingBy()分组示例

Collectors.groupingBy() 分组之常见用法

功能代码:

/**
 * 使用java8 stream groupingBy操作,按城市分组list
 */
public void groupingByCity() {
    Map<String, List<Employee>> map = employees.stream().collect(Collectors.groupingBy(Employee::getCity));
    map.forEach((k, v) -> {
        System.out.println(k + " = " + v);
    });
}

Collectors.groupingBy() 分组之统计每个分组的count

功能代码:

/**
 * 使用java8 stream groupingBy操作,按城市分组list统计count
 */
public void groupingByCount() {
    Map<String, Long> map = employees.stream()
            .collect(Collectors.groupingBy(Employee::getCity, Collectors.counting()));

    map.forEach((k, v) -> {
        System.out.println(k + " = " + v);
    });
}

Collectors.groupingBy() 分组之统计分组平均值

功能代码:

/**
 * 使用java8 stream groupingBy操作,按城市分组list并计算分组年龄平均值
 */
public void groupingByAverage() {
    Map<String, Double> map = employees.stream()
            .collect(Collectors.groupingBy(Employee::getCity, Collectors.averagingInt(Employee::getAge)));

    map.forEach((k, v) -> {
        System.out.println(k + " = " + v);
    });
}

Collectors.groupingBy() 分组之统计分组总值

功能代码:

/**
 * 使用java8 stream groupingBy操作,按城市分组list并计算分组销售总值
 */
public void groupingBySum() {
    Map<String, Long> map = employees.stream()
            .collect(Collectors.groupingBy(Employee::getCity, Collectors.summingLong(Employee::getAmount)));

    map.forEach((k, v) -> {
        System.out.println(k + " = " + v);
    });

    // 对Map按照分组销售总值逆序排序
    Map<String, Long> sortedMap = new LinkedHashMap<>();
    map.entrySet().stream().sorted(Map.Entry.<String, Long> comparingByValue().reversed())
            .forEachOrdered(e -> sortedMap.put(e.getKey(), e.getValue()));

    sortedMap.forEach((k, v) -> {
        System.out.println(k + " = " + v);
    });
}

Collectors.groupingBy() 分组之Join分组List

功能代码:

/**
 * 使用java8 stream groupingBy操作,按城市分组list并通过join操作连接分组list中的对象的name 属性使用逗号分隔
 */
public void groupingByString() {
    Map<String, String> map = employees.stream().collect(Collectors.groupingBy(Employee::getCity,
            Collectors.mapping(Employee::getName, Collectors.joining(", ", "Names: [", "]"))));

    map.forEach((k, v) -> {
        System.out.println(k + " = " + v);
    });
}

Collectors.groupingBy() 分组之转换分组结果List -> List

功能代码:

/**
 * 使用java8 stream groupingBy操作,按城市分组list,将List转化为name的List
 */
public void groupingByList() {
    Map<String, List<String>> map = employees.stream().collect(
            Collectors.groupingBy(Employee::getCity, Collectors.mapping(Employee::getName, Collectors.toList())));

    map.forEach((k, v) -> {
        System.out.println(k + " = " + v);
        v.stream().forEach(item -> {
            System.out.println("item = " + item);
        });
    });
}

Collectors.groupingBy() 分组之转换分组结果List -> Set

功能代码:

/**
 * 使用java8 stream groupingBy操作,按城市分组list,将List转化为name的Set
 */
public void groupingBySet() {
    Map<String, Set<String>> map = employees.stream().collect(
            Collectors.groupingBy(Employee::getCity, Collectors.mapping(Employee::getName, Collectors.toSet())));

    map.forEach((k, v) -> {
        System.out.println(k + " = " + v);
        v.stream().forEach(item -> {
            System.out.println("item = " + item);
        });
    });
}

Collectors.groupingBy() 分组之使用对象分组List

功能代码:

/**
 * 使用java8 stream groupingBy操作,通过Object对象的成员分组List
 */
public void groupingByObject() {
    Map<Manage, List<Employee>> map = employees.stream().collect(Collectors.groupingBy(item -> {
        return new Manage(item.getName());
    }));

    map.forEach((k, v) -> {
        System.out.println(k + " = " + v);
    });
}

Collectors.groupingBy() 分组之使用两个成员分组List

功能代码:

/**
 * 使用java8 stream groupingBy操作, 基于city 和name 实现多次分组
 */
public void groupingBys() {
    Map<String, Map<String, List<Employee>>> map = employees.stream()
            .collect(Collectors.groupingBy(Employee::getCity, Collectors.groupingBy(Employee::getName)));

    map.forEach((k, v) -> {
        System.out.println(k + " = " + v);
        v.forEach((i, j) -> {
            System.out.println(i + " = " + j);
        });
    });
}

自定义Distinct对结果去重

功能代码

/**
 * 使用java8 stream groupingBy操作, 基于Distinct 去重数据
 */
public void groupingByDistinct() {
    List<Employee> list = employees.stream().filter(distinctByKey(Employee :: getCity))
            .collect(Collectors.toList());;

    list.stream().forEach(item->{
        System.out.println("city = " + item.getCity());
    });


}

/**
 * 自定义重复key 规则
 * @param keyExtractor
 * @return
 */
private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
    Set<Object> seen = ConcurrentHashMap.newKeySet();
    return t -> seen.add(keyExtractor.apply(t));
}

原文地址https://blog.csdn.net/zhouzhiwengang/article/details/112319054

posted @ 2023-07-28 17:15  译林  阅读(88)  评论(0编辑  收藏  举报