如何使用Stream将Map的Map转换为Object的Map

时间:2017-12-10 21:06:07

标签: java java-stream

我有一个带有Builder的课程:

Student.builder().name("Name").email("Email").phone("Phone").build();
class Student {
    String name;
    String email;
    String phone; 
}

我有Map<String, Map<String, String>转换为Map<String, Student>

("GroupA", ("name", "Steve"))
("GroupA", ("email", "steve@gmail.com"))
("GroupA", ("phone", "111-222-3333"))
("GroupB", ("name", "Alice"))
("GroupB", ("email", "alice@gmail.com"))
("GroupB", ("phone", "111-222-4444"))
("GroupC", ("name", "Bobby"))
("GroupC", ("email", "bobby@gmail.com"))
("GroupC", ("phone", "111-222-5555"))

我正在尝试使用Stream来使代码更清洁但不确定如何实现此目的。我使用普通Java代码

Map<String, Student> newStudentMap = new HashMap<>();
for (Map.Entry<String, Map<String, String>> entry : studentMap.entrySet()) {
    Map<String, String> value = entry.getValue();
    Student student = Student.builder()
            .name(value.get("name"))
            .email(value.get("email")))
            .phone(value.get("phone"))
            .build();
    newStudentMap.put(entry.getKey(), student);
}

1 个答案:

答案 0 :(得分:2)

试试这个:

Map<String, Student> newStudentMap = studentMap.entrySet().stream().collect(Collectors.toMap(
    Map.Entry::getKey, 
    e -> Student.builder()
           .name(e.getValue().get("name"))
           .email(e.getValue().get("email"))
           .phone(e.getValue().get("phone"))
           .build()
    ));

工作原理:

您获取地图的入口集,将其流式传输然后使用Collectors.toMap收集器收集到新地图,该收集器接受用于为新地图创建键和值的两个函数(键映射器和值映射器) 。您需要原始地图中的密钥,因此您只需传递方法参考Map.Entry::getKey即可从条目中获取密钥。要创建新值,您需要传递一个Map.Entry e的函数,并从中创建一个新的Student