Flatten Java Object using Streams

Kevin Rave :

I have a class like this:

class Student {
  String name;
  String age;
  List<Course> Courses;

}

class Course {
  String courseName;
  String teacher;
}

I have:

 List<Student> students

I want to get:

List<Objects> objects 

with values Like this:

Kevin  22  CS   Rob
Kevin  22  MT   Chris    
Mary   21  AT   Harry
Mary   21  AP   Henry
Mary   21  PP   Joe
Prak   25  null null

Whats the simplest way to do this using Java 8 Streams? Can flatMap help?

Look at the last one. Even though Prak is not enrolled in any courses (i.e.List<Course> is empty), I want to get the record too, with just Student, along with other ones

Damián Rafael Lattenero :

If you want a new object flatted, yes, a combinations of flatMap and map will work, but checking if the List is empty or not:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Test1 {

    public static void main(String[] args) {
        Course course1 = new Course("course 1", "teacher 1");
        Course course2 = new Course("course 2", "teacher 2");
        Course course3 = new Course("course 3", "teacher 3");
        Course course4 = new Course("course 4", "teacher 4");
        Student student1 = new Student("name 1", "15", Arrays.asList(course1, course2, course3, course4));
        Student student2 = new Student("name 2", "16", new ArrayList<>());
        Student student3 = new Student("name 2", "16", Arrays.asList(course1, course3));
        Student student4 = new Student("name 4", "17", new ArrayList<>());

        List<Student> students = Arrays.asList(student1, student2, student3, student4);

    List<Objects> objects = students.stream().flatMap(student -> 
        student.getCourses().isEmpty() ?
            Stream.of(new Objects(student.getName(), student.getAge(), null, null)) :
            student.getCourses().stream().map(course -> new Objects(student.getName(), student.getAge(), course.getCourseName(), course.getTeacher()))
    ).collect(Collectors.toList());

        objects.forEach(System.out::println);
    }
}

class Course {
    String courseName;
    String teacher;

    public Course(String courseName, String teacher) {
        this.courseName = courseName;
        this.teacher = teacher;
    }

    public String getCourseName() {
        return courseName;
    }

    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }

    public String getTeacher() {
        return teacher;
    }

    public void setTeacher(String teacher) {
        this.teacher = teacher;
    }
}

class Student {
    String name;
    String age;
    List<Course> courses;

    public Student(String name, String age, List<Course> courses) {
        this.name = name;
        this.age = age;
        this.courses = courses;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public List<Course> getCourses() {
        return courses;
    }

    public void setCourses(List<Course> courses) {
        this.courses = courses;
    }
}

class Objects{
    String name;
    String age;
    String courseName;
    String teacher;

    public Objects(String name, String age, String courseName, String teacher) {
        this.name = name;
        this.age = age;
        this.courseName = courseName;
        this.teacher = teacher;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getCourseName() {
        return courseName;
    }

    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }

    public String getTeacher() {
        return teacher;
    }

    public void setTeacher(String teacher) {
        this.teacher = teacher;
    }

    @Override
    public String toString() {
        return "name: " + this.name + " age: " + this.age + " course name: " + this.getCourseName() + " teacher: " + this.getTeacher();
    }
}

output

name: name 1 age: 15 course name: course 1 teacher: teacher 1
name: name 1 age: 15 course name: course 2 teacher: teacher 2
name: name 1 age: 15 course name: course 3 teacher: teacher 3
name: name 1 age: 15 course name: course 4 teacher: teacher 4
name: name 2 age: 16 course name: null teacher: null
name: name 2 age: 16 course name: course 1 teacher: teacher 1
name: name 2 age: 16 course name: course 3 teacher: teacher 3
name: name 4 age: 17 course name: null teacher: null

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=147170&siteId=1