我有一个带有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);
}
答案 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