+
 新版

java8 stream 对sql 一对多 grouingBy

开养老院的银 发布于 2017/07/23 18:54
阅读 1K+
收藏 2

sql查出来一对多的List<Map<String,Object>>数据,stream怎么grouingby合并啊{  "data": [ { "room_id": "1","name": "语文简体" }, { "room_id": "1", "name": "语文繁体"}]}转化{  "data": [ { "room_id": "1","names":[ "语文简体", "语文繁体"]]}

网上看的stream介绍入门都算不上,全是用类中怎么怎么样,

加载中
0
开
开养老院的银

这,不好,我想用留grouingby,这种不好,效率低

0
kse-music
kse-music

    public static void main(String[] args) {
        Map<String,Object> map1 = Maps.newHashMap();
        map1.put("room_id", "1");
        map1.put("name", "语文简体");
        Map<String,Object> map2 = Maps.newHashMap();
        map2.put("room_id", "1");
        map2.put("name", "语文繁体");
        List<Map<String,Object>> list = Lists.newArrayList(map1,map2);
        
        Map<String,Object> map = Maps.newHashMap();
        list.stream().collect(Collectors.groupingBy(m -> m.get("room_id"),Collectors.mapping(m -> m.get("name"),Collectors.toList()))).forEach((k,v) -> {
            map.put("room_id", k);
            map.put("names", v);
        });
        System.out.println(map);
    }

0
开
开养老院的银

引用来自“kse-music”的评论

    public static void main(String[] args) {
        Map<String,Object> map1 = Maps.newHashMap();
        map1.put("room_id", "1");
        map1.put("name", "语文简体");
        Map<String,Object> map2 = Maps.newHashMap();
        map2.put("room_id", "1");
        map2.put("name", "语文繁体");
        List<Map<String,Object>> list = Lists.newArrayList(map1,map2);
        
        Map<String,Object> map = Maps.newHashMap();
        list.stream().collect(Collectors.groupingBy(m -> m.get("room_id"),Collectors.mapping(m -> m.get("name"),Collectors.toList()))).forEach((k,v) -> {
            map.put("room_id", k);
            map.put("names", v);
        });
        System.out.println(map);
    }

谢谢,用上并行是不是更快,我不需要顺序,,很好,,我在优化下,,,多谢

kim_o
kim_o
数据量少 就没必要并行了 自己测试下把
0
开
开养老院的银

引用来自“kse-music”的评论

    public static void main(String[] args) {
        Map<String,Object> map1 = Maps.newHashMap();
        map1.put("room_id", "1");
        map1.put("name", "语文简体");
        Map<String,Object> map2 = Maps.newHashMap();
        map2.put("room_id", "1");
        map2.put("name", "语文繁体");
        List<Map<String,Object>> list = Lists.newArrayList(map1,map2);
        
        Map<String,Object> map = Maps.newHashMap();
        list.stream().collect(Collectors.groupingBy(m -> m.get("room_id"),Collectors.mapping(m -> m.get("name"),Collectors.toList()))).forEach((k,v) -> {
            map.put("room_id", k);
            map.put("names", v);
        });
        System.out.println(map);
    }

如果多个group分组,怎么弄啊,网上的都不是很好,我如果想根据2个字段或多个字段grouingby下去,这个怎么办法。。。。。。请教下。。。。。刚学java

0
kse-music
kse-music

        Map<String,Object> map = Maps.newHashMap();
        list.stream().collect(Collectors.groupingBy(m -> m.get("room_id"),Collectors.groupingBy(m -> m.get("room_name")))).forEach((k,v) -> {
            map.put("room_id", k);
            v.forEach((k2,v2)->{
                map.put("room_name", k2);
                List<Map<String,Object>> rs = new ArrayList<>();
                v2.forEach(mm -> {
                    Map<String,Object> m = new HashMap<>();
                    m.put("name", mm.get("name"));
                    m.put("time",  mm.get("time"));
                    rs.add(m);
                });
                map.put("data", rs);
            });
        });
        System.out.println(map);

0
开
开养老院的银

引用来自“kse-music”的评论

        Map<String,Object> map = Maps.newHashMap();
        list.stream().collect(Collectors.groupingBy(m -> m.get("room_id"),Collectors.groupingBy(m -> m.get("room_name")))).forEach((k,v) -> {
            map.put("room_id", k);
            v.forEach((k2,v2)->{
                map.put("room_name", k2);
                List<Map<String,Object>> rs = new ArrayList<>();
                v2.forEach(mm -> {
                    Map<String,Object> m = new HashMap<>();
                    m.put("name", mm.get("name"));
                    m.put("time",  mm.get("time"));
                    rs.add(m);
                });
                map.put("data", rs);
            });
        });
        System.out.println(map);

多谢

0
开
开养老院的银

引用来自“kse-music”的评论

        Map<String,Object> map = Maps.newHashMap();
        list.stream().collect(Collectors.groupingBy(m -> m.get("room_id"),Collectors.groupingBy(m -> m.get("room_name")))).forEach((k,v) -> {
            map.put("room_id", k);
            v.forEach((k2,v2)->{
                map.put("room_name", k2);
                List<Map<String,Object>> rs = new ArrayList<>();
                v2.forEach(mm -> {
                    Map<String,Object> m = new HashMap<>();
                    m.put("name", mm.get("name"));
                    m.put("time",  mm.get("time"));
                    rs.add(m);
                });
                map.put("data", rs);
            });
        });
        System.out.println(map);

引用来自“开养老院的银”的评论

多谢

大神问下有没有很好的方式,听说,reduce可以做这种吗,拜托。。。

kse-music
kse-music
你可以找说的那个人呀
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部