Javaは - オブジェクトのリストにリスト変数を持つオブジェクトを回し

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());

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=191187&siteId=1