首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何让Collectors.groupingBy()返回排序后的LinkedHashMap?

Collectors.groupingBy() 是 Java 8 引入的一个非常有用的流操作,它允许你根据某个属性对集合中的元素进行分组。然而,groupingBy() 默认返回的是一个 HashMap,它不保证元素的顺序。如果你想要返回一个排序后的 LinkedHashMap,你需要在收集结果之后对其进行排序。

以下是一个示例代码,展示了如何实现这一点:

代码语言:txt
复制
import java.util.*;
import java.util.stream.Collectors;

public class GroupingByExample {
    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
            new Person("Alice", 20),
            new Person("Bob", 30),
            new Person("Charlie", 20),
            new Person("David", 30),
            new Person("Eve", 25)
        );

        // 使用 Collectors.groupingBy() 分组,并将结果转换为 LinkedHashMap
        Map<Integer, List<Person>> groupedByAge = people.stream()
            .collect(Collectors.groupingBy(Person::getAge))
            .entrySet().stream()
            .sorted(Map.Entry.comparingByKey())
            .collect(Collectors.toMap(
                Map.Entry::getKey,
                Map.Entry::getValue,
                (oldValue, newValue) -> oldValue,
                LinkedHashMap::new
            ));

        // 打印结果
        groupedByAge.forEach((age, list) -> {
            System.out.println(age + ": " + list);
        });
    }
}

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return name;
    }
}

在这个示例中,我们首先使用 Collectors.groupingBy() 根据年龄对人员进行分组。然后,我们对分组的结果进行排序,并将其转换为 LinkedHashMap。这里的关键步骤是使用 entrySet().stream() 来获取分组的条目流,然后使用 sorted(Map.Entry.comparingByKey()) 对这些条目按照键(在这个例子中是年龄)进行排序。最后,我们使用 Collectors.toMap() 将排序后的条目收集到一个新的 LinkedHashMap 中。

参考链接:

这种方法的优势在于它保持了分组的顺序,并且可以很容易地集成到现有的流操作中。它适用于任何需要对分组结果进行排序的场景,例如当你需要按照某个属性展示分组数据时。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

collectors.groupingby属性分组_group by having order by

大家好,又见面了,我是你们朋友全栈君。 问题描述: 当我们对List根据时间排序,然后根据某个字段分组,会产生乱序问题。...解决办法: 因为Collectors.groupingBy分组默认返回HashMap类型,我们修改为LinkedHashMap即可。...通过源码可以看到,我们可以上传三个参数,分别是: classifier:按照什么分组 mapFactory:最后结果返回容器 downstream:收集分类结果收集器 当我们只上传一个参数...样例: LinkedHashMap> resultSort; //根据开始日期排序, groupBy字段分组返回类型修改为LinkedHashMap...(ProcessDetails::getGroupBy,LinkedHashMap::new,Collectors.toList())); 以上就是Collectors.groupingBy分组乱序问题全部内容

62520

java8 lambada表达式Collectors.groupingBy分组顺序无序

最近有个需求就是按照uuid进行分组排序,虽然最初list是按照时间排序,但是分组一直数据都是错乱,后来查了资料可以看到groupingBy有三个参数,第一个参数就是keyFunction了,...第二个参数是一个map工厂,也就是最终结果容器,一般默认是采用HashMap::new,最后一个参数很重要是一个downstream,类型是Collector,也是一个收集器,那就是说,这三个参数其实就是为了解决分组问题...第一个参数:分组按照什么分类 第二个参数:分组最后用什么容器保存返回 第三个参数:按照第一个参数分类,对应分类结果如何收集 其实一个参数Collectors.groupingBy方法 ,第二个参数默认是...Map> modelMap = modelVOList.stream().collect(Collectors.groupingBy(Model::getUuid..., LinkedHashMap::new, Collectors.toList())); 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/171428.html原文链接

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

    大家好,又见面了,我是你们朋友全栈君。 问题: 遇到一个小问题,查询出来一组数据,按照其中属性进行groupBy 分组 ,分组要保证顺序不变。...但是实际用groupBy进行分组返回数据是杂乱无章,没有按照原来list 顺序返回 排查 首先去api中查找解决,查看Java java.util.stream 包 Collectors...关于 LinkedHashMap 信息自行百度 解决 创建Person数据集合,然后按照年龄排序排序后进行分组,保证分组顺序不变。...,并按照排序结果进行有序分组 LinkedHashMap> ageMap = personsSort.stream().sorted(Comparator.comparingInt...(Person::getAge)).collect(Collectors.groupingBy(Person::getAge, LinkedHashMap::new, Collectors.toList

    1.3K40

    如何修改配置EasyNVR获取录像接口返回精确录像文件?

    有用户需要获取EasyNVR平台录像视频指定时间段录像文件,但是目前平台生成切片默认是3s一个ts文件,目前第一个ts文件和最后一个ts文件不是完整ts文件,会导致用户调用录像时候会出现多1s或者少...1s录像文件。...1)首先,需要先调整EasyNVRts切片生成时长(默认为3s,我们可更改为1s): 2)更改完成,在设备端(摄像机/录像机)更改推送I帧间隔时间为1s: 3)在保存完摄像机参数,因为上述步骤修改了...EasyNVR配置文件参数,所以需要重启EasyNVR服务参数生效,然后查看下效果: 在m3u8文件中查看到,已经是1s一个ts文件,所以在后续调用之后就会得到一个准确录像文件。...EasyNVR目前在线下场景中也有较为广泛应用,如智慧工厂、智慧园区、智慧码头、智慧港口、智慧农场等等。感兴趣用户可以前往演示平台进行体验或部署测试。

    81330

    如何修改配置EasyNVR获取录像接口返回精确录像文件?

    有用户需要获取EasyNVR平台录像视频指定时间段录像文件,但是目前平台生成切片默认是3s一个ts文件,目前第一个ts文件和最后一个ts文件不是完整ts文件,会导致用户调用录像时候会出现多1s或者少...1s录像文件。...1)首先,需要先调整EasyNVRts切片生成时长(默认为3s,我们可更改为1s): 2)更改完成,在设备端(摄像机/录像机)更改推送I帧间隔时间为1s: 3)在保存完摄像机参数,因为上述步骤修改了...EasyNVR配置文件参数,所以需要重启EasyNVR服务参数生效,然后查看下效果: 在m3u8文件中查看到,已经是1s一个ts文件,所以在后续调用之后就会得到一个准确录像文件。...EasyNVR目前在线下场景中也有较为广泛应用,如智慧工厂、智慧园区、智慧码头、智慧港口、智慧农场等等。感兴趣用户可以前往演示平台进行体验或部署测试。

    76930

    奇怪知识增加了,如何 (a == 1 && a == 2 && a == 3) 返回 true

    原文:http://www.fly63.com/article/detial/851 前两天在网上看到了一道很有趣题目,题目大意为:js[1] 环境下,如何 a == 1 && a == 2 &&...a == 3 这个表达式返回 true ?。...这个表达式成为 true 关键就在于这里宽松相等,js[3] 在处理宽松相等时会对一些变量进行隐式转换。在这种隐式转换作用下,真的可以一个变量在一个表达式中变成不同值。...方法,在这个方法内部,我们每次增加另一个变量值并返回,就能够在这条表达式中使得 a 结果有不同值。...; } 同样,Proxy 对象默认 toString 和 valueOf 方法会返回这个被 getter 劫持过结果,也能够在宽松相等条件下满足题意。

    1K30

    如何app在后台被干掉优雅启动

    有这么一个场景,在用户用着你开发app时候,突然某个聊天工具来消息了,切换到聊天工具长时间停留,并且可能做了一些你不知道操作,比如看视频阿,刷刷消息圈什么。...这种时候用户切换到app准备继续操作时,如果开发师处理不好,就会引起崩溃情况,肯定会出现返回时候一瞬间白屏,对于用户体验来说,非常不好。...然后从“最近打开应用”中选中该App,回到界面是C activity,假设App中没有静态变量,这个时候是不会crash,点击返回到B,这个时候也只是短暂白屏显示B界面。...所以回到App时,显示还是C页面。另外当activity被强杀时,系统会调用onSaveInstance去你保存一些变量,但我个人觉得面对海量静态变量,这个根本不够用。...那且想想如何它不回到C而是重走流程呢?也就是说中断C初始化而回到A,并且按back键,不会回到C,B。考虑一下。 我们先实例化这个场景吧。

    2.5K20

    强大 Stream 函数式编程

    Java8 API 添加了一个新抽象称为流 Stream,可以你以一种声明方式处理数据。Stream API 可以极大提高 Java 程序员生产力,程序员写出高效率、干净、简洁代码。...流操作种类 中间操作 当数据源中数据上了流水线,这个过程对数据进行所有操作都称为“中间操作”。 中间操作仍然会返回一个流对象,因此多个中间操作可以串连起来形成一个流水线。...终端操作 当所有的中间操作完成,若要将数据从流水线上拿下来,则需要执行终端操作。 终端操作将返回一个执行结果,这就是你想要数据。...Sorted 是一个中间操作,能够返回一个排过序流对象视图。流对象中元素会默认按照自然顺序进行排序,除非你自己指定一个 Comparator 接口来改变排序规则。...对 Person 列表进行排序, 排序规则: 根据 Person 姓名倒序排序, 然后利用 Collectors 返回列表新列表; List personList = persons

    2.7K70
    领券