tanvi:
@Getter
static class Student {
private Map<Status, Marks> statusAndMarks;
}
class Status {
}
class Marks {
}
Map<Status, Student> map = new HashMap<>();
for (Student student : studentList) {
for (Status status : student.getStatusAndMarks().keySet()) {
map.put(status, student);
}
}
どのように私は、Java 8で機能的なスタイルで上記の記述されたコードを書くのですか?私は、次のコードを書かれているが、どのように私は私のコードの結果は不変のマップであることを記述しないと私はラムダ前にマップを作成する必要はありませんか?
studentList
.forEach(student -> {
student
.getStatusAndMarks()
.keySet().stream()
.map(key -> map.put(key, statusKeyImportantMessage));
});
また:
あなたが使用していた場合は、十分に近かったforEach
として再度キーセットを反復するために:
Map<Status, Student> map = new HashMap<>();
studentList.forEach(student ->
student.getStatusAndMarks().keySet()
.forEach(k -> map.put(k,student)));
このため、他の回答で述べたのと同様の表現は次のようになります
Map<Status, Student> map = studentList.stream()
.flatMap(s -> s.getStatusAndMarks().keySet()
.stream()
.map(status -> new AbstractMap.SimpleEntry<>(status, s)))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a, b) -> b));
注、マージ機能は、反復の後半に見られるのと同じ状態で、新たな学生を上書きすることです。一方、どのようなクエリには本当に便利な情報がステータスを与えられた学生のリストになる可能性があります。これらは、以下と同様のストリームパイプラインを使用してグループ化することができます。
Map<Status, List<Student>> statusWiseStudent = studentList.stream()
.flatMap(s -> s.getStatusAndMarks().keySet()
.stream()
.map(status -> new AbstractMap.SimpleEntry<>(status, s)))
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue, Collectors.toList())));