zoukankan      html  css  js  c++  java
  • Java8 stream 中利用 groupingBy 进行多字段分组求和

    Java8的groupingBy实现集合的分组,类似Mysql的group by分组功能,注意得到的是一个map

    对集合按照单个属性分组

    case1:

    List<String> items =
            Arrays.asList("apple", "apple", "banana",
                    "apple", "orange", "banana", "papaya");
    // 分组
    Map<String, List<String>> result1 = items.stream().collect(
            Collectors.groupingBy(
                    Function.identity()
            )
    );
    //{papaya=[papaya], orange=[orange], banana=[banana, banana], apple=[apple, apple, apple]}
    System.out.println(result1);
    // 分组计数
    Map<String, Long> result2 = items.stream().collect(
            Collectors.groupingBy(
                    Function.identity(), Collectors.counting()
            )
    );
    // {papaya=1, orange=1, banana=2, apple=3}
    System.out.println(result2);
    Map<String, Long> finalMap = new LinkedHashMap<>();
    //分组, 计数和排序
    result2.entrySet().stream()
            .sorted(Map.Entry.<String, Long>comparingByValue().reversed())
            .forEachOrdered(e -> finalMap.put(e.getKey(), e.getValue()));
    // {apple=3, banana=2, papaya=1, orange=1}
    System.out.println(finalMap);

    case2:

    User user1 = new User("zhangsan", "beijing", 10);
    User user2 = new User("zhangsan", "beijing", 20);
    User user3 = new User("lisi", "shanghai", 30);
    List<User> list = new ArrayList<User>();
    list.add(user1);
    list.add(user2);
    list.add(user3);
    Map<String, List<User>> collect = list.stream()
            .collect(
                    Collectors.groupingBy(
                            User::getName/*, Collectors.counting()*/
                    )
            );
    //{lisi=[User{age=30, name='lisi', address='shanghai'}], 
    // zhangsan=[User{age=10, name='zhangsan', address='beijing'}, User{age=20, name='zhangsan', address='beijing'}]}
    System.out.println(collect);

    集合按照多个属性分组

    1.多个属性拼接出一个组合属性

    public static void main(String[] args) {
        User user1 = new User("zhangsan", "beijing", 10);
        User user2 = new User("zhangsan", "beijing", 20);
        User user3 = new User("lisi", "shanghai", 30);
        List<User> list = new ArrayList<User>();
        list.add(user1);
        list.add(user2);
        list.add(user3);
        Map<String, List<User>> collect = list.stream().collect(Collectors.groupingBy(e -> fetchGroupKey(e)));
        //{zhangsan#beijing=[User{age=10, name='zhangsan', address='beijing'}, User{age=20, name='zhangsan', address='beijing'}], 
        // lisi#shanghai=[User{age=30, name='lisi', address='shanghai'}]}
        System.out.println(collect);
    }
    private static String fetchGroupKey(User user){
        return user.getName() +"#"+ user.getAddress();
    }

    2.嵌套调用groupBy

    不过感觉这样把问题搞复杂了

    User user1 = new User("zhangsan", "beijing", 10);
    User user2 = new User("zhangsan", "beijing", 20);
    User user3 = new User("lisi", "shanghai", 30);
    List<User> list = new ArrayList<User>();
    list.add(user1);
    list.add(user2);
    list.add(user3);
    Map<String, Map<String, List<User>>> collect
            = list.stream().collect(
                    Collectors.groupingBy(
                            User::getAddress, Collectors.groupingBy(User::getName)
                    )
    );
    System.out.println(collect);

    Ref:

    https://stackoverflow.com/questions/28342814/group-by-multiple-field-names-in-java-8#

  • 相关阅读:
    不忘初心,方得始终
    我的博客开通了~第一个帖子奉上
    @TableLogic表逻辑处理注解(逻辑删除)
    nginx笔记
    ERROR: permission denied for relation hycom 权限被拒绝
    Mybatis-plus学习笔记
    SpringBoot学习笔记
    org.apache.ibatis.binding.BindingException原因总结(找不到映射文件)
    SpringBoot优先加载设置
    Date时间处理
  • 原文地址:https://www.cnblogs.com/winner-0715/p/10246037.html
Copyright © 2011-2022 走看看