canpan14:
私の基本的なクラスは次のとおりです。
public class Student {
public String name;
public String className; // In real code I'd have a second object for return to the end user
public List<String> classes; // Can be zero
}
私のようなものを返すことができますので、私はそれを平らにしたいのですが
[
{
"name":"joe",
"class":"science"
},
{
"name":"joe",
"class":"math"
},
]
簡略化のために明らかに愚かな例。
私はそれを行うことができました唯一の方法は、のようないくつかのロングったらしいコードを次のとおりです。
List<Student> students = getStudents();
List<Student> outputStudents = new ArrayList<>();
students.forEach(student -> {
if(student.getClasses().size() > 0) {
student.getClasses().forEach(clazz -> {
outputStudents.add(new Student(student.getName(), clazz));
});
} else {
outputStudents.add(student);
}
});
多分flapMapを使用して、これを簡素化する方法がある場合はお探しですか?
jwismar:
はい、あなたはこのような何かを行うことができる必要があります:
Student student = ?
List<Student> output =
student
.getClasses()
.stream()
.map(clazz -> new Student(student.getName, student.getClassName, clazz))
.collect(Collectors.toList());
単一の学生のために。学生のコレクションのために、それは、もう少し複雑です。
(@nullpointerからによるコメントでの観察に更新しました。ありがとうございます!)
List<Student> listOfStudents = getStudents();
List<Student> outputStudents =
listOfStudents
.stream()
.flatMap(student -> {
List<String> classes = student.getClasses();
if (classes.isEmpty()) return ImmutableList.of(student).stream();
return classes.stream().map(clazz -> new Student(student.getName(), student.getClassName(), ImmutableList.of(clazz)));
})
.collect(Collectors.toList());