资讯

展开

解决使用Lambda分组后,每组多条数据处理

作者:快盘下载 人气:

解决使用Lambda分组后;每组多条数据处理

前言业务背景业务解决

前言

使用Lambda编程;可以简化很多代码;方便开发。

业务背景

public class B {
    private String id;
    //用户id
    private String userId;
    //手机号
    private String phone;
    //ip地址
    private String ip;

    public B(String id, String userId, String phone, String ip) {
        this.id = id;
        this.userId= userId;
        this.phone= phone;
        this.ip = ip;
    }
}
public class Test{
    private static List<B> list = new ArrayList<>();

    static {
        B b = new B(;005;,;295;,;195;,;115;);
        B b1 = new B(;007;,;295;,;197;,;115;);
        B b2 = new B(;008;,;295;,;197;,;117;);
        B b3 = new B(;009;,;296;,;198;,;119;);
        B b4 = new B(;010;,;297;,;197;,;115;);
        B b5 = new B(;011;,;297;,;197;,;111;);
        B b6 = new B(;012;,;297;,;197;,;112;);
        list.add(b);
        list.add(b1);
        list.add(b2);
        list.add(b3);
        list.add(b4);
        list.add(b5);
        list.add(b6);
    }
}

以上面数据为例;此数据已处理;;需要查询用户手机号不同ip两条以上数据;前提确保userId、phone、ip相同数据只会出现一条;。

业务解决

第一时间想到使用;Lambda分组的方式;通过userId和phone作为key

    public static void main(String[] args) {

        Map<String, List<B>> collect = list.stream()
                .collect(Collectors.groupingBy(item -> item.getUserId() ; ;_; ; item.getPhone()));
        for (Map.Entry<String, List<B>> map:collect.entrySet()) {
            System.out.println(;key;;; map.getKey();;;size;;;map.getValue().size());
        }
        /** Output
         *  key;296_198;size;1
         *  key;295_197;size;2
         *  key;297_197;size;3
         *  key;295_195;size;1
         */
    }

通过打印结果;可以清楚的看到每个分组下面有多少条数据。

然后我们只需要过滤出2条以上的数据。

    public static void main(String[] args) {
        list.stream()
                .collect(Collectors.groupingBy(item -> item.getUserId() ; ;_; ; item.getPhone()))
                .entrySet()
                .stream()
                .filter(item -> item.getValue().size() >= 2)
                .forEach(item -> {
		            List<B> value = item.getValue();
		            for (B b:value){
		                System.out.println(b.toString());
		            }
        });
        /** Output
         *  B{id=;007;, userId=;295;, phone=;197;, ip=;115;}
         *  B{id=;008;, userId=;295;, phone=;197;, ip=;117;}
         *  B{id=;010;, userId=;297;, phone=;197;, ip=;115;}
         *  B{id=;011;, userId=;297;, phone=;197;, ip=;111;}
         *  B{id=;012;, userId=;297;, phone=;197;, ip=;112;}
         */
    }

对比一下原始数据是否正确
解决使用Lambda分组后,每组多条数据处理

过滤的数据没问题;然后通过entrySet()遍历Map把这些数据提取出来;就能得到ip两条以上数据;使用flatMap()方法;进行重新组合;。

    public static void main(String[] args) {
        List<B> collect = list.stream()
                .collect(Collectors.groupingBy(item -> item.getUserId() ; ;_; ; item.getPhone()))
                .entrySet()
                .stream()
                .filter(item -> item.getValue().size() >= 2)
                .flatMap(item -> item.getValue().stream()).collect(Collectors.toList());
        for (B b:collect) {
            System.out.println(b.toString());
        }
        /** Output
         *  B{id=;007;, userId=;295;, phone=;197;, ip=;115;}
         *  B{id=;008;, userId=;295;, phone=;197;, ip=;117;}
         *  B{id=;010;, userId=;297;, phone=;197;, ip=;115;}
         *  B{id=;011;, userId=;297;, phone=;197;, ip=;111;}
         *  B{id=;012;, userId=;297;, phone=;197;, ip=;112;}
         */
    }

这样就可以拿到完整List数据;如果你需要提取出这些集合中某一个数据;可以通过map()方法映射出字段。

    public static void main(String[] args) {
        List<String> collect = list.stream()
                .collect(Collectors.groupingBy(item -> item.getUserId() ; ;_; ; item.getPhone()))
                .entrySet()
                .stream()
                .filter(item -> item.getValue().size() >= 2)
                .flatMap(item -> item.getValue().stream())
                .map(item->item.getId()).collect(Collectors.toList());
        for (String id:collect) {
            System.out.println(id);
        }
        /** Output
         *  007
         *  008
         *  010
         *  011
         *  012
         */
    }

后续你有其他处理;也很简单;只需要再后面追加你需要处理的方法即可。

加载全部内容

相关教程
猜你喜欢
用户评论
快盘暂不提供评论功能!