作用:
- Collectors.toMap将List转为Map
定义
public final class Collectors {
public static <T, K, U>
Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper) {
return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);
}
public static <T, K, U>
Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction) {
return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new);
}
public static <T, K, U, M extends Map<K, U>>
Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction,
Supplier<M> mapSupplier) {
BiConsumer<M, T> accumulator
= (map, element) -> map.merge(keyMapper.apply(element),
valueMapper.apply(element), mergeFunction);
return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID);
}
}
使用示例
定义 User类
package com.github.mouday.demo;
public class User {
private Integer id;
private String name;
private Integer age;
public User(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
toMap 使用示例
package com.github.mouday.demo;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
public class Demo {
public static void main(String[] args) {
List<User> users = Arrays.asList(
new User(1, "Tom", 20),
new User(2, "Jack", 30),
new User(3, "Steve", 40)
);
// id作为key, user对象作为value
// Function.identity() 等价于 t -> t
Map<Integer, User> collect = users.stream()
.collect(Collectors.toMap(User::getId, Function.identity()));
System.out.println(collect);
// {
// 1=User{id=1, name='Tom', age=20},
// 2=User{id=2, name='Jack', age=30},
// 3=User{id=3, name='Steve', age=40}
// }
// id作为key, name作为value
Map<Integer, String> collect1 = users.stream()
.collect(Collectors.toMap(User::getId, User::getName));
System.out.println(collect1);
// {1=Tom, 2=Jack, 3=Steve}
}
}
如果key重复,会报错
Exception in thread "main" java.lang.IllegalStateException:
Duplicate key User{id=1, name='Tom', age=20}
如果key键重复,我们取后者
package com.github.mouday.reggie;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
public class Demo {
public static void main(String[] args) {
List<User> users = Arrays.asList(
new User(1, "Tom", 20),
new User(2, "Jack", 30),
new User(3, "Steve", 40),
new User(1, "Judi", 50)
);
// id作为key, user对象作为value
// Function.identity() 等价于 t -> t
Map<Integer, User> collect = users.stream()
.collect(Collectors.toMap(User::getId, Function.identity(), (n1, n2) -> n2));
System.out.println(collect);
// {
// 1=User{id=1, name='Judi', age=50},
// 2=User{id=2, name='Jack', age=30},
// 3=User{id=3, name='Steve', age=40}
// }
// id作为key, name作为value
Map<Integer, String> collect1 = users.stream()
.collect(Collectors.toMap(User::getId, User::getName, (n1, n2) -> n2));
System.out.println(collect1);
// {1=Judi, 2=Jack, 3=Steve}
}
}