使用Stream将列表中的数据去重,并返回最早的一条数据

任务描述:

在返回的用户信息列表中,如果用户名字(name字段)相同,则只返回用户创建时间(createTime字段)最早的一条数据。

信息实体类:

@Data
public class User {
    private String userId;
    private String name;
    private String address;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
    private Date createTime;

}

测试类:

public static void main(String[] args) throws Exception{
        SimpleDateFormat sdf  = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));

        User user1 = new User();
        user1.setUserId("11");
        user1.setAddress("地址11");
        user1.setName("姓名11");
        user1.setCreateTime(sdf.parse("2020-07-09 21:12:45"));

        User user2 = new User();
        user2.setUserId("22");
        user2.setAddress("地址22");
        user2.setName("姓名22");
        user2.setCreateTime(sdf.parse("2020-08-09 21:12:45"));

        User user3 = new User();
        user3.setUserId("33");
        user3.setAddress("地址33");
        user3.setName("姓名33");
        user3.setCreateTime(sdf.parse("2020-07-10 21:12:45"));

        User user4 = new User();
        user4.setUserId("44");
        user4.setAddress("地址44");
        user4.setName("姓名44");

        User user5 = new User();
        user5.setUserId("55");
        user5.setAddress("地址55");
        user5.setName("姓名55");

        User user6 = new User();
        user6.setUserId("66");
        user6.setAddress("地址66");
        user6.setName("姓名11");
        user6.setCreateTime(sdf.parse("2016-01-10 21:12:45"));

        User user7 = new User();
        user7.setUserId("11");
        user7.setAddress("地址77777");
        user7.setName("姓名11");
      //  user7.setCreateTime(sdf.parse("2020-01-10 21:12:45"));

        User user8 = new User();
        user8.setUserId("11");
        user8.setAddress("地址8888");
        user8.setName("姓名11");
       // user8.setCreateTime(sdf.parse("2020-05-10 21:12:45"));

        List<User> list1 = new ArrayList<>();
        list1.add(user1);
        list1.add(user2);
        list1.add(user3);
        list1.add(user7);
        list1.add(user8);
        list1.add(user6);

       
        System.out.println("输出m1的值111:" + JSONObject.toJSONString(list1));
       
        //防止CreateTime字段为空,给它设置初始值
        List<User> list5 = list1.stream().filter(e -> {
            if(e.getCreateTime() == null){
                try {
                    e.setCreateTime(sdf.parse("9999-12-31 23:00:00"));
                } catch (ParseException parseException) {
                    parseException.printStackTrace();
                }
                return true;
        }
            return true;
        }).collect(Collectors.toList());

        System.out.println("输出m1的值555:" + JSONObject.toJSONString(list5));

        //列表中重复的数据取时间最早的一条
        Map<String, User> collect = list5.stream().collect(
                Collectors.groupingBy(User::getName,
                        Collectors.collectingAndThen(Collectors.reducing((c1, c2) -> c1.getCreateTime().getTime() < c2.getCreateTime().getTime() ? c1 : c2),
                                Optional::get)));
        List<User> list6  = new ArrayList<>(collect.values());
        System.out.println("输出m1的值666:" + JSONObject.toJSONString(list6));





    }

运行结果:

输出m1的值111[{"address":"地址11","createTime":1594300365000,"name":"姓名11","userId":"11"},{"address":"地址22","createTime":1596978765000,"name":"姓名22","userId":"22"},{"address":"地址33","createTime":1594386765000,"name":"姓名33","userId":"33"},{"address":"地址77777","name":"姓名11","userId":"11"},{"address":"地址8888","name":"姓名11","userId":"11"},{"address":"地址66","createTime":1452431565000,"name":"姓名11","userId":"66"}]



输出m1的值555[{"address":"地址11","createTime":1594300365000,"name":"姓名11","userId":"11"},{"address":"地址22","createTime":1596978765000,"name":"姓名22","userId":"22"},{"address":"地址33","createTime":1594386765000,"name":"姓名33","userId":"33"},{"address":"地址77777","createTime":253402268400000,"name":"姓名11","userId":"11"},{"address":"地址8888","createTime":253402268400000,"name":"姓名11","userId":"11"},{"address":"地址66","createTime":1452431565000,"name":"姓名11","userId":"66"}]



输出m1的值666[{"address":"地址33","createTime":1594386765000,"name":"姓名33","userId":"33"},{"address":"地址22","createTime":1596978765000,"name":"姓名22","userId":"22"},{"address":"地址66","createTime":1452431565000,"name":"姓名11","userId":"66"}]

Colletors工具学习更多:

对于更多的Steam中Colletors工具的操作方法:
Colletors工具的操作方法

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值