java8 Stream使用中的一些实践

使用Stream将List转换为Map时key冲突问题

如下:
把userList转换为userMap
id为key user 为value 由于user2和user3的id相同,所以会报错

    @Test
    void testStream0() {
        User user1 = new User();
        user1.setId("1");
        user1.setName("小明");
        User user2 = new User();
        user2.setId("2");
        user2.setName("小红");
        User user3 = new User();
        user3.setId("2");
        user3.setName("小蓝");

        List<User> userList = new ArrayList<>();
        userList.add(user1);
        userList.add(user2);
        userList.add(user3);
        // 把userList转换为userMap key为id value为user  由于user2和user3的id相同,所以会报错
        Map<String, User> userMap = userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));
    }

执行结果:Duplicate key

java.lang.IllegalStateException: Duplicate key User(id=2, name=小红)
	at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
	at java.util.HashMap.merge(HashMap.java:1255)
	at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)

正确使用方式:

明确指定key冲突时选择哪一个


// 把userList转换为userMap key为id value为user  遇到key冲突时,选择第二个key的值value2覆盖第一个key的值value1
Map<String, User> userMap = userList.stream().collect(Collectors.toMap(User::getId, Function.identity(), (value1,value2)-> value2));


使用Stream时得到List的size为不为0,元素Object为null问题

    @Test
    void testStream0() {
        User user1 = new User();
        user1.setId("1");

        List<User> userList = new ArrayList<>();
        userList.add(user1);
        List<String> list = userList.stream().map(u -> {
            if (StringUtils.isNotBlank(u.getName())) {
                return u.getName();
            } else {
                return null;
            }
        }).collect(Collectors.toList());
        System.out.println(list.size());
        System.out.println(JSON.toJSONString(list));
    }

可以使用filter方法过滤掉null值

List<String> list = userList.stream().map(u -> {
            if (StringUtils.isNotBlank(u.getName())) {
                return u.getName();
            } else {
                return null;
            }
        }).filter(Objects::nonNull).collect(Collectors.toList());
  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值