Java8中list转map⽅法总结
背景
在最近的⼯作开发之中,慢慢习惯了很多Java8中的Stream的⽤法,很⽅便⽽且也可以并⾏的去执⾏这个流,这边去写⼀下昨天遇到的⼀个list转map的场景。
list转map在Java8中stream的应⽤
常⽤⽅式
1.利⽤Map⽅法进⾏转换
public Map<Long, String> getIdNameMap(List<Account> accounts) {
return accounts.stream().Map(Account::getId, Account::getUsername));
}
其中第⼀个参数就是可以,第⼆个参数就是value的值。
2.收集对象实体本⾝
- 在开发过程中我们也需要有时候对⾃⼰的list中的实体按照其中的⼀个字段进⾏分组(⽐如 id ->List),这时候要设置map的value值是实体本⾝。
public Map<Long, Account> getIdAccountMap(List<Account> accounts) {
return accounts.stream().Map(Account::getId, account -> account));
}
account -> account是⼀个返回本⾝的lambda表达式,其实还可以使⽤Function接⼝中的⼀个默认⽅法 Function.identity(),这个⽅法返回⾃⾝对象,更加简洁
重复key的情况。
在list转为map时,作为key的值有可能重复,这时候流的处理会抛出个异常:Java.lang.IllegalStateException:Duplicate key。这时候就要在toMap⽅法中指定当key冲突时key的选择。(这⾥是选择第⼆个key覆盖第⼀个key)
public Map<String, Account> getNameAccountMap(List<Account> accounts) {
java stream
return accounts.stream().Map(Account::getUsername, Function.identity(), (key1, key2) -> key2));
}
1. ⽤groupingBy 或者 partitioningBy进⾏分组
根据⼀个字段或者属性分组也可以直接⽤groupingBy⽅法,很⽅便。
Map<Integer, List<Person>> personGroups = ate(new PersonSupplier()).
limit(100).
upingBy(Person::getAge));
Iterator it = Set().iterator();
while (it.hasNext()) {
Map.Entry<Integer, List<Person>> persons = (Map.Entry) it.next();
System.out.println("Age " + Key() + " = " + Value().size());
}
partitioningBy可以理解为特殊的groupingBy,key值为true和false,当然此时⽅法中的参数为⼀个判断语句(⽤于判断的函
数式接⼝)
Map<Boolean, List<Person>> children = ate(new PersonSupplier()).
limit(100).
collect(Collectors.partitioningBy(p -> p.getAge() < 18));
System.out.println("Children number: " + (true).size());
System.out.println("Adult number: " + (false).size());
关于stream使⽤的好⽂推荐:
这⾥去看了ibm的⼀篇关于stream的⽂章,get到了不少stream还没遇到过的⽤法。⽼铁们可以去学习⼀下。[ ]

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。