[java]集合类stream的相关操作

1.对list中的map进行分组

下面例子中,根据高度height属性进行分组

java 复制代码
List<Map<String, Float>>originalList = new ArrayList<>();
        originalList.add(new HashMap<String,Float>() {{
            put("lng", 180.0f);
            put("lat",90f);
            put("val",10f);
            put("height", 100.0f);
        }});

        originalList.add(new HashMap<String,Float>() {{
            put("lng", 180.0f);
            put("lat",90f);
            put("val",11f);
            put("height", 100.0f);
        }});

        originalList.add(new HashMap<String,Float>() {{
            put("lng", 180.0f);
            put("lat",90f);
            put("val",20f);
            put("height", 200.0f);
        }});

        originalList.add(new HashMap<String,Float>() {{
            put("lng", 180.0f);
            put("lat",90f);
            put("val",21f);
            put("height", 200.0f);
        }});

        Map<Object, List<Map>> groupedMap = originalList.stream().collect(Collectors.groupingBy(map -> {
            return map.get("height");
        }));

        System.out.println(groupedMap);

执行结果:

从结果可以看到,已经按照height进行分组成功了。

2.对list中的map进行分组,根据分组后的key进行排序

同样,还是先根据height进行分组,默认分组后生成的Map是不会根据高度进行排序的,因为Map没有这个功能,所以需要再多做一次才做。看代码:

java 复制代码
List<Map<String, Float>>originalList = new ArrayList<>();
        originalList.add(new HashMap<String,Float>() {{
            put("lng", 180.0f);
            put("lat",90f);
            put("val",10f);
            put("height", 100.0f);
        }});

        originalList.add(new HashMap<String,Float>() {{
            put("lng", 180.0f);
            put("lat",90f);
            put("val",11f);
            put("height", 100.0f);
        }});

        originalList.add(new HashMap<String,Float>() {{
            put("lng", 180.0f);
            put("lat",90f);
            put("val",20f);
            put("height", 200.0f);
        }});

        originalList.add(new HashMap<String,Float>() {{
            put("lng", 180.0f);
            put("lat",90f);
            put("val",21f);
            put("height", 200.0f);
        }});

        Map<Object, List<Map>> groupedMap = originalList.stream().collect(Collectors.groupingBy(map -> {
            return map.get("height");
        }));

        // 使用TreeMap对键进行排序
        TreeMap<Object, List<Map>> sortedGroupedMap = new TreeMap<Object, List<Map>>(groupedMap);
        System.out.println(sortedGroupedMap);

打印结果:

可以看到map第一个元素key是100,第二个key是200,说明排序成功

3.对list中的map进行分组,并求每个组中最大值对应的数据

从图中可以看到heigh为100这组里面,有2条数据,这2个也是map,每个map中包含了lng,lat,height,val,现在要将val的值最大的那个map查出来。代码如下:

java 复制代码
 List<Map<String, Float>>originalList = new ArrayList<>();
        originalList.add(new HashMap<String,Float>() {{
            put("lng", 180.0f);
            put("lat",90f);
            put("val",10f);
            put("height", 100.0f);
        }});

        originalList.add(new HashMap<String,Float>() {{
            put("lng", 180.0f);
            put("lat",90f);
            put("val",11f);
            put("height", 100.0f);
        }});

        originalList.add(new HashMap<String,Float>() {{
            put("lng", 180.0f);
            put("lat",90f);
            put("val",20f);
            put("height", 200.0f);
        }});

        originalList.add(new HashMap<String,Float>() {{
            put("lng", 180.0f);
            put("lat",90f);
            put("val",21f);
            put("height", 200.0f);
        }});


        // 按照alti进行分组,并找出每个组中val的最大值
        Map<Object, Optional<Map<String, Float>>> result = originalList.stream()
            .collect(Collectors.groupingBy(map -> map.get("height"),Collectors.maxBy(Comparator.comparing(map -> Float.valueOf(map.get("val"))))
        ));


        System.out.println(result);

运行结果:

从结果可以看出通过height进行了分组,并将分组后,求出了每组中最大值的数据。

相关推荐
郭庆汝4 小时前
pytorch、torchvision与python版本对应关系
人工智能·pytorch·python
柳鲲鹏5 小时前
WINDOWS最快布署WEB服务器:apache2
服务器·前端·windows
Fireworkitte6 小时前
Apache POI 详解 - Java 操作 Excel/Word/PPT
java·apache·excel
weixin-a153003083166 小时前
【playwright篇】教程(十七)[html元素知识]
java·前端·html
DCTANT6 小时前
【原创】国产化适配-全量迁移MySQL数据到OpenGauss数据库
java·数据库·spring boot·mysql·opengauss
Touper.6 小时前
SpringBoot -- 自动配置原理
java·spring boot·后端
黄雪超6 小时前
JVM——函数式语法糖:如何使用Function、Stream来编写函数式程序?
java·开发语言·jvm
ThetaarSofVenice7 小时前
对象的finalization机制Test
java·开发语言·jvm
思则变7 小时前
[Pytest] [Part 2]增加 log功能
开发语言·python·pytest
漫谈网络7 小时前
WebSocket 在前后端的完整使用流程
javascript·python·websocket