当前位置: 首页 > news >正文

解决使用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两条以上数据(前提确保userIdphoneip相同数据只会出现一条)。

业务解决

第一时间想到使用,Lambda分组的方式,通过userIdphone作为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'}
         */
    }

对比一下原始数据是否正确
在这里插入图片描述

过滤的数据没问题,然后通过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
         */
    }

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

相关文章:

  • 商业地产如何走出高空置率困局?
  • <学习笔记>从零开始自学Python-之-基础语法篇(十一)正则表达式re库
  • 随想录一期 day2 [977.有序数组的平方|209. 长度最小的子数组|59.螺旋矩阵II(剥洋葱)]
  • 自动驾驶数据标注基本框架,你了解多少?丨曼孚科技
  • 前景理论-风险决策分析的思维模型
  • Intel汇编-CMOV条件传送指令
  • 基于java宠物交易计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
  • 单片机毕设选题 - 便携式空气质量检测系统(物联网 嵌入式)
  • gsnark中的证明方案及曲线
  • LL(1)文法定义及判别
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • 02-C语言经典算法100例
  • 〖Python 数据库开发实战 - Python与Redis交互篇③〗- 利用 redis-py 实现列表数据类型的常用指令操作
  • LwIP学习笔记1 - LwIP的设计目的、分层设计思想及模块划分概览
  • 使用 Convex 进行状态管理的指南
  • “大数据应用场景”之隔壁老王(连载四)
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • JavaScript创建对象的四种方式
  • LeetCode算法系列_0891_子序列宽度之和
  • npx命令介绍
  • RxJS: 简单入门
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • Sublime text 3 3103 注册码
  • Theano - 导数
  • WebSocket使用
  • 区块链将重新定义世界
  • 如何编写一个可升级的智能合约
  • 如何选择开源的机器学习框架?
  • 思维导图—你不知道的JavaScript中卷
  • 在Unity中实现一个简单的消息管理器
  • - 转 Ext2.0 form使用实例
  • Semaphore
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (Ruby)Ubuntu12.04安装Rails环境
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (二)正点原子I.MX6ULL u-boot移植
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (转)Mysql的优化设置
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .Net 8.0 新的变化
  • .net core Swagger 过滤部分Api
  • .net core使用ef 6
  • .net 受管制代码
  • .net 无限分类
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [1181]linux两台服务器之间传输文件和文件夹
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下