Collectors.toMap的几个注意点,hashMap是无序的

1、Collectors.toMap注意点

1、 key不能有重复,否则会报错
2、value不能为空,否则报空指针

2.解决方法

  1. 不使用stream
    不使用stream时,需要先new一个map,然后手动把list的每一项放入map
    public void test0() {
        User user1 = new User();
        user1.setId(1L);
        user1.setName("1");

        User user2 = new User();
        user2.setId(2L);
        user2.setName("2");

        List<User> list = Lists.newArrayList();
        list.add(user1);
        list.add(user2);
        Map<Long, String> map = new HashMap<>();
        for(User user : list) {
            map.put(user.getId(), user.getName());
        }
    }

2、使用stream流
解决第一个问题:
Collectors.toMap指定merge函数
可以自定义一个merge函数来确定key重复时,如何取value。比如下面这种写法,是保留第一个value。你也可以保留第二个,或者是做一些更复杂的处理。

Map<Long, String> map = list.stream().collect(Collectors.toMap(User::getId, User::getName, (x1,x2)->x1));

解决第二个问题
虽然说Map的value是支持null值的,但是map自己的merge方法天生不支持,此时仅靠自定义merge方法也已经无能为力了。如果仍然想使用Collectors.toMap,需要手动处理null的值,比如:

Map<Long, String> map = list.stream().collect(Collectors.toMap(User::getId, value -> Optional.ofNullable(value.getName()).orElse("")));
posted @ 2024-07-30 14:42  spiderMan1-1  阅读(154)  评论(0编辑  收藏  举报