使用stream流对List<Map<String, Object>>集合根据value进行排序

这篇具有很好参考价值的文章主要介绍了使用stream流对List<Map<String, Object>>集合根据value进行排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第一步:初始化数据

	/**
     * 初始化一个用于排序的集合出来
     */
    private List<Map<String, Object>> getInitData(){
        List<Map<String, Object>> list = new ArrayList<>();
        Map<String, Object> map1 = new HashMap<>();
        map1.put("name", "wangwu");
        map1.put("count", "41");
        map1.put("time", "15:15");
        list.add(map1);

        Map<String, Object> map2 = new HashMap<>();
        map2.put("name", "zhaoliu");
        map2.put("count", "31");
        map2.put("time", "15:30");
        list.add(map2);

        Map<String, Object> map3 = new HashMap<>();
        map3.put("name", "zhangsan");
        map3.put("count", "11");
        map3.put("time", "12:30");
        list.add(map3);

        Map<String, Object> map4 = new HashMap<>();
        map4.put("name", "lisi");
        map4.put("count", "12");
        map4.put("time", "10:00");
        list.add(map4);

        return list;
    }

=========================================================文章来源地址https://www.toymoban.com/news/detail-591430.html

第二步:开始排序

① 根据数字排序
	/**
     * 根据数字类型的value排序
     */
    @Test
    public void sortByInt() {
        List<Map<String, Object>> list = getInitData();
        list.forEach(c -> System.out.println("排序前===>>" + c));

        // 第一种:如果value是int类型(1,2,3),可以直接强转然后进行排序
//        list = list.stream().sorted(Comparator.comparing(c -> (Integer)c.get("count"))).collect(Collectors.toList());


        // 第二种:如果value是String类型("1","2","3"),需要先转成String之后再转换成int类型,然后进行排序
        list = list.stream().sorted(Comparator.comparing(c -> Integer.parseInt(c.get("count").toString()))).collect(Collectors.toList());

        // 第三种:
        list = list.stream().sorted((c1, c2) -> {
            Integer count1 = Integer.valueOf(c1.get("count").toString());
            Integer count2 = Integer.valueOf(c2.get("count").toString());
            return count1.compareTo(count2);        // 正序
//            return count2.compareTo(count1);        // 倒序
        }).collect(Collectors.toList());

        // 第四种:上面这种方法可以直接使用String类型进行排序,所以
        list = list.stream().sorted((c1, c2) -> {
            String count1 = c1.get("count").toString();
            String count2 = c2.get("count").toString();
            return count1.compareTo(count2);        // 正序
//            return count2.compareTo(count1);        // 倒序
        }).collect(Collectors.toList());
        
        // 最直接的逆转排序也可以
        Collections.reverse(list);

        System.out.println("================== 分割线 ====================");
        list.forEach(c -> System.out.println("排序后===>>" + c));
    }
打印结果
排序前===>>{name=wangwu, count=41, time=15:15}
排序前===>>{name=zhaoliu, count=31, time=15:30}
排序前===>>{name=zhangsan, count=11, time=12:30}
排序前===>>{name=lisi, count=12, time=10:00}
================== 分割线 ====================
排序后===>>{name=zhangsan, count=11, time=12:30}
排序后===>>{name=lisi, count=12, time=10:00}
排序后===>>{name=zhaoliu, count=31, time=15:30}
排序后===>>{name=wangwu, count=41, time=15:15}

② 根据字符串排序
	/**
     * 根据字符串排序 (askii码表)
     */
    @Test
    public void sortByString() {
        List<Map<String, Object>> list = getInitData();
        list.forEach(c -> System.out.println("排序前===>>" + c));

        list = list.stream().sorted((c1, c2) -> {
//            return c1.get("name").toString().compareTo(c2.get("name").toString());
            String name1 = c1.get("name").toString();
            String name2 = c2.get("name").toString();
            return name1.compareTo(name2);      // 正序
//            return name2.compareTo(name1);      // 倒序
        }).collect(Collectors.toList());

		// 逆转顺序
//        Collections.reverse(list);

        System.out.println("================== 分割线 ====================");
        list.forEach(c -> System.out.println("排序后===>>" + c));
    }
打印结果
排序前===>>{name=wangwu, count=41, time=15:15}
排序前===>>{name=zhaoliu, count=31, time=15:30}
排序前===>>{name=zhangsan, count=11, time=12:30}
排序前===>>{name=lisi, count=12, time=10:00}
================== 分割线 ====================
排序后===>>{name=lisi, count=12, time=10:00}
排序后===>>{name=wangwu, count=41, time=15:15}
排序后===>>{name=zhangsan, count=11, time=12:30}
排序后===>>{name=zhaoliu, count=31, time=15:30}

③ 根据时间类型排序
	/**
     * 根据时间排序
     */
    @Test
    public void sortByDate(){
        List<Map<String, Object>> list = getInitData();
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
        list.forEach(c -> System.out.println("排序前===>>" + c));

        // 第一种:直接使用String类型去排序
        list = list.stream().sorted(Comparator.comparing(c -> c.get("time").toString())).collect(Collectors.toList());

        // 第二种:转换为时间类型然后再排序
        list = list.stream().sorted((c1, c2) ->{
            Date time1 = null;
            Date time2 = null;
            try {
                time1 = sdf.parse(c1.get("time").toString());
                time2 = sdf.parse(c2.get("time").toString());
            } catch (ParseException e) {
                e.printStackTrace();
            }
//            return time1.compareTo(time2);      // 正序
            return time1.compareTo(time2);      // 倒序

        }).collect(Collectors.toList());
        
        // 顺序逆转
        Collections.reverse(list);

        System.out.println("================== 分割线 ====================");
        list.forEach(c -> System.out.println("排序后===>>" + c));
    }
打印结果
排序前===>>{name=wangwu, count=41, time=15:15}
排序前===>>{name=zhaoliu, count=31, time=15:30}
排序前===>>{name=zhangsan, count=11, time=12:30}
排序前===>>{name=lisi, count=12, time=10:00}
================== 分割线 ====================
排序后===>>{name=lisi, count=12, time=10:00}
排序后===>>{name=zhangsan, count=11, time=12:30}
排序后===>>{name=wangwu, count=41, time=15:15}
排序后===>>{name=zhaoliu, count=31, time=15:30}
总结:String类型是万金油的排序方式,基本都可以用!!!



补充一个排序方法
	@Test
    public void sort() {
        List<Map<String, Object>> list = getInitData();
        list.forEach(c -> System.out.println("排序前===>>" + c));

        Collections.sort(list, (o1, o2) -> {
            return o1.get("count").toString().compareTo(o2.get("count").toString());
        });
        
        System.out.println("================== 分割线 ====================");
        list.forEach(c -> System.out.println("排序后===>>" + c));
    }
打印结果
排序前===>>{name=wangwu, count=41, time=15:15}
排序前===>>{name=zhaoliu, count=31, time=15:30}
排序前===>>{name=zhangsan, count=11, time=12:30}
排序前===>>{name=lisi, count=12, time=10:00}
================== 分割线 ====================
排序后===>>{name=zhangsan, count=11, time=12:30}
排序后===>>{name=lisi, count=12, time=10:00}
排序后===>>{name=zhaoliu, count=31, time=15:30}
排序后===>>{name=wangwu, count=41, time=15:15}

就这样。。。

到了这里,关于使用stream流对List<Map<String, Object>>集合根据value进行排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Stream流对集合排序

    有一些业务需要对集合按照一些规则进行排序,本篇介绍如何用Stream()对集合进行升序或者降序操作。 之前只有接触过使用数据库进行排序,有一些情况需要不同的排序结果,如果进行多次查询会多次操作数据库,所以有些地方使用流对集合操作是更好的选择。 Stream 流 - 调

    2024年02月12日
    浏览(49)
  • Java-WebSocket通信 实现根据查询条件主动实时回传数据给前端&List<Map<String, Object>>转JSON编码器&WebSocket无法注册Bean问题解决方案

    项目背景:Java环境,Get请求根据前端查询条件建立WebSocket连接,每5秒主动实时推送最新查询结果给前端展示。其中也遇到定时器、WebSocket无法注册Bean、No encoder specified for object of class [class java.util.xxx]等问题,相关解决方案也有列举~ Web Sockets 的是在一个单独的持久连接上提

    2024年02月04日
    浏览(38)
  • java 对象list使用stream根据某一个属性转换成map的几种方式

    可以使用Java 8中的Stream API将List转换为Map,并根据某个属性作为键或值。以下是一些示例代码: 在这个示例中,将Person对象列表转换为Map,其中键为Person对象的name属性,值为Person对象本身。 在这个示例中,将Person对象列表转换为Map,其中键为Person对象本身,值为Person对象的

    2024年02月13日
    浏览(42)
  • JSON转换List<Map<String, Object>>、Map<String, Object>

    废话就不说了 早上10点研究到现在 获取redis的JSON字符串 String getPalletListNew = redisService.getRedis(“getPalletListNew”, abroad + “” + goodsLevel + “” + startPort + “” + destinationPort + “” + maxTon + “” + minTon); 转换MapString,Object public MapString, Object jsonToMap(String json){ MapString, Object map = new

    2024年02月20日
    浏览(37)
  • 使用Lambda表达式对List<Map<String,Object>>中key值相同的Map进行分组合并

    现有两张表A表和B表,A表存放的是各省市的认证次数,B表存放的是各省市的申领次数,重点关注dq,cs这两个字段,其他的字段可忽略                                                      A表(省市认证次数表)                                                 B表

    2024年02月13日
    浏览(37)
  • List<Map<String, Object>>

    ListMapString, Object 是一个Java数据结构,它是一个列表(List),其中每个元素都是一个Map。在每个Map中,键(key)是字符串(String),值(value)可以是任何对象(Object)。 这种数据结构通常用于存储和处理一组相关的数据记录。例如,可以使用ListMapString, Object 存储数据库查询结果,其

    2023年04月21日
    浏览(30)
  • <List<Map<String,Object>>>Map中多个属性转成List Map

    举例: 原始数据 :{001=张三, 002=李四, 003=王五, 004=赵六} 目标数据 : {value=张三, key=001} {value=李四, key=002} {value=王五, key=003} {value=赵六, key=004} 输出: 单独封装工具类案例:

    2024年02月11日
    浏览(33)
  • List<Map<String, Object>> 转List<T> list map对象转list对象

    我们在处理数据的时候,经常用到map对象转java对象。 要转换的对象 pom文件JSON包 : 如果此篇文章有帮助到您, 希望打大佬们能 关注 、 点赞 、 收藏 、 评论 支持一波,非常感谢大家! 如果有不对的地方请指正!!! 参考1 参考2

    2024年02月13日
    浏览(31)
  • <List<Map<String,Object>>>循环List Map获取里面的key和value,进行操作

    输出: Map循环:(Value为Object)

    2024年02月12日
    浏览(31)
  • 如何使用Stream流将List转换为Map

    以下程序用到的基础代码:

    2024年02月04日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包