1、Collectors.toMap注意點
1、 key不能有重複,否則會報錯
2、value不能為空,否則報空指標
2.解決方法
- 不使用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("")));