作用:

  • 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}
}


}