java8 小技巧保证分组groupingBy后排序不变

java8 小技巧保证分组groupingBy后排序不变问题:遇到一个小问题,查询出来一组数据后,按照其中的属性进行groupBy分组,分组后要保证顺序不变。排查首先去api中查找解决//一个参数publicstatic<T,K>Collector<T,?,Map<K,List<T>>>groupingBy(Function<?superT,?ex…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

问题:

遇到一个小问题,查询出来一组数据后,按照其中的属性进行groupBy 分组 ,分组后要保证顺序不变。但是实际用groupBy进行分组后,返回的数据是杂乱无章的,没有按照原来list 的顺序返回

排查

首先去api中查找解决,查看Java 的 java.util.stream 包 Collectors 类 groupingBy 方法实现,结果如下:

//一个参数
   public static <T, K> Collector<T, ?, Map<K, List<T>>>
    groupingBy(Function<? super T, ? extends K> classifier) {
        return groupingBy(classifier, toList());
    }

//两个参数
    public static <T, K, A, D>
    Collector<T, ?, Map<K, D>> groupingBy(Function<? super T, ? extends K> classifier,
                                          Collector<? super T, A, D> downstream) {
        return groupingBy(classifier, HashMap::new, downstream);
    }
    
//三个参数
  public static <T, K, D, A, M extends Map<K, D>>
    Collector<T, ?, M> groupingBy(Function<? super T, ? extends K> classifier,
                                  Supplier<M> mapFactory,
                                  Collector<? super T, A, D> downstream) {......}

通过java api 发现 groupingBy 调用是内部自己创建了一个 HashMap ( HashMap::new)。因为 hashMap,是无无序的,是根据key的hashcode进行hash,然后放入对应的地方。所以在按照一定顺序put进HashMap中,然后遍历出HashMap的顺序跟put的顺序不同。

知道这个了就明白了为什么无序了。所以我们直接调用三个参数的 groupingBy 方法mapFactory ,传入有顺序的Map, LinkedHashMap 就可以了。

关于 LinkedHashMap 的信息自行百度

解决

创建Person数据集合,然后按照年龄排序,排序后进行分组,保证分组后顺序不变。

//创建数据
 private static List<Person> getPersionList() {
        List<Person> persons = new ArrayList<>();
        for (int i = 1; i <= 40; i++) {
            Random r = new Random();
            Person person = new Person();
            person.setName("abel-" + i);
            person.setSex((int) (Math.random() * 2));
            person.setGroup(String.valueOf(i%2));
            person.setAge(25 + r.nextInt(50));
            persons.add(person);
        }
        return persons;

    }


    /**
     * 分组
     */
    private static void groupByTest() {
        List<Person> persons = getPersionList();
        //将list 排序,并按照排序后的结果进行有序分组
        LinkedHashMap<Integer, List<Person>> ageMap = personsSort.stream().sorted(Comparator.comparingInt(Person::getAge)).collect(Collectors.groupingBy(Person::getAge, LinkedHashMap::new, Collectors.toList()));
    }

关于 排序Comparator.comparingInt 参考:
https://www.jianshu.com/p/3f621e51f3

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/171442.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • matlab怎么输出dxf格式文件,matlab创建DXF文件

    matlab怎么输出dxf格式文件,matlab创建DXF文件DXFLibDXFLib AutocadDXFis relatedappli AutoCADDXFc

    2025年8月22日
    0
  • kthreaddi挖矿病毒

    kthreaddi挖矿病毒今天上服务器一查看cpu被占满了,使用了top命令一看,好家伙看到kthreaddi进程占用cpu300%老子气坏了,没碰见过,什么是kthreaddi白百度了一圈,原来【kthreaddi】是挖矿病毒不断的写入定时任务执行操作先是top命令查占用进程PID29221直接杀死但是过一段时间又会自动的建立进程使用查看定时任务命令crontab-e果然有一条定时任务,更加可气的是找不到这个文件解决办法:删除这条命名,然后又top命名kill-9PID杀死进…

    2022年5月10日
    60
  • oracle 数据库隔离级别

    oracle 数据库隔离级别[b]事务不同引发的状况:[/b]脏读(Dirtyreads)一个事务读取另一个事务尚未提交的修改时,产生脏读很多数据库允许脏读以避免排它锁的竞争。不可重复读(Nonrepeatablereads)同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发…

    2022年5月9日
    27
  • idea 正则表达式替换「建议收藏」

    idea 正则表达式替换「建议收藏」例如,现在有一个函数getView(o,’m’,’orderNum’,’s’),这个函数的调用有很多地方,有一天我们想给这个函数加一个默认参数,让它变成getView(o,’m’,’orderNum’,’s’,’*’),一个一个加太麻烦了,我们就用idea自带的正则表达式替换功能来实现。首先按Ctrl+R,打开替换对话框,然后在上面输入getView\((.+)\),下面输…

    2022年5月17日
    318
  • 漯河恢复常态化疫情防控工作_你尝试使用的应用程序

    漯河恢复常态化疫情防控工作_你尝试使用的应用程序问题:windows平台怎么运行.netcore控制台解决一:.netcore跨平台,控制台在生成后并不会生成exe文件直接在生成目录启用cmd,或者直接cd到相应目录startdotnet你的控制台名字.dll 问题:强制生成exe文件在控制台项目管理文件 xxx.csproj 添加下面一行&lt;PropertyGroup&gt;  &lt;Outp…

    2025年5月28日
    3
  • 在IDEA上Git的入门使用(IDEA+Git)[通俗易懂]

    在IDEA上Git的入门使用(IDEA+Git)[通俗易懂]前言:Git是目前最常用的版本控制系统,而IDEA又是目前日渐流行的ide,因此现在来介绍在IDEA上Git的入门使用。 准备:Git、IDEA、GitHub账号开始之前先创建一个简单的测试项目 将代码交由Git管理    VCS ——&gt; EnableVersionControlIntegration…    ——&gt; 选择要使…

    2022年6月16日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号