如何使用java8中的流映射从类对象列表生成hashmap或hashtable?

时间:2016-11-17 15:09:41

标签: java hashmap java-8 java-stream

class Student {
    int studentId;
    String studentName;
    String studentDept;
    public Student() {}
}

我有这些学生对象列表,

List<Student> studentList;

我想从这些学生列表对象生成哈希映射。

HashMap<Integer,String> studentHash;

hashmap包含sudentid和名单列表键值对。

2 个答案:

答案 0 :(得分:3)

这样的事情:

studentList.stream().collect(
    Collectors.toMap(Student::getStudentId, Student::getStudentName)
)

答案 1 :(得分:2)

由于您显然需要Map特定实施,因此您应该使用Collectors.toMap方法,以便提供mapSupplier而不是toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper)因为即使在场景后面仍会返回HashMap,它也没有明确指定到javadoc中,所以你无法确定它在下一版本的Java中是否仍然存在。

所以你的代码应该是这样的:

HashMap<Integer,String> studentHash = studentList.stream().collect(
    Collectors.toMap(
        s -> s.studentId, s -> s.studentName,
        (u, v) -> {
            throw new IllegalStateException(
                String.format("Cannot have 2 values (%s, %s) for the same key", u, v)
            );
        }, HashMap::new
    )
);

如果您不关心Map的实施,只需使用toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper)作为收集器作为下一个:

Map<Integer,String> studentHash = studentList.stream().collect(
    Collectors.toMap(s -> s.studentId, s -> s.studentName)
);