使用流展平Java对象

使用流展平Java对象,java,java-8,java-stream,flatten,Java,Java 8,Java Stream,Flatten,我有一门课是这样的: 班级学生{ 字符串名; 弦年龄; 列出课程; } 班级课程{ 字符串courseName; 弦乐教师; } 我有: 列出学生名单 我想得到: 列出对象 有这样的价值观: Kevin 22 CS Rob Kevin 22 MT Chris Mary 21 AT Harry Mary 21 AP Henry Mary 21 PP Joe Prak 25 null null 使用Java8流最简单的方法是什么? flatMap

我有一门课是这样的:

班级学生{ 字符串名; 弦年龄; 列出课程; } 班级课程{ 字符串courseName; 弦乐教师; } 我有:

列出学生名单 我想得到:

列出对象 有这样的价值观:

Kevin  22  CS   Rob
Kevin  22  MT   Chris
Mary   21  AT   Harry
Mary   21  AP   Henry
Mary   21  PP   Joe
Prak   25  null null
使用Java8流最简单的方法是什么? flatMap能帮忙吗


看最后一个。即使Prak没有参加任何课程,即列表为空,我也希望获得记录,只有学生和其他人

如果你想将新对象展平,是的,flatMap和map的组合将起作用,但检查列表是否为空:

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

请看下面的代码,我也在底部粘贴了输出。在这里,我们可以使用具有四个字符串实例变量的某个对象的列表,而不是使用列表

列表c1=Arrays.aslistnewcoursecs、Rob、newcoursemt、Chris

    List<Course> c2= Arrays.asList(new Course("AT", "Harry"), new Course("AP","Henry"),  new Course("PP", "Joe"));

    List<Course> c3= Arrays.asList(new Course());
    List<Student> s1= Arrays.asList(new Student("Kevin", "22", c1), new Student("Mary", "21", c2), new Student("Prak", "25", c3));

   List<String> list= s1.stream().flatMap(s-> s.getCourses().stream().map(d1-> s.getName()+" "+s.getAge()+" "+""+d1.getCourseName()+" "+d1.getTeacher()) ).collect(Collectors.toList());
   list.forEach( System.out::println);
输出:

凯文22 CS罗布 凯文22米克里斯 玛丽21岁,哈利21岁 玛丽·亨利 玛丽21页乔 普拉克25空

    List<Course> c2= Arrays.asList(new Course("AT", "Harry"), new Course("AP","Henry"),  new Course("PP", "Joe"));

    List<Course> c3= Arrays.asList(new Course());
    List<Student> s1= Arrays.asList(new Student("Kevin", "22", c1), new Student("Mary", "21", c2), new Student("Prak", "25", c3));

   List<String> list= s1.stream().flatMap(s-> s.getCourses().stream().map(d1-> s.getName()+" "+s.getAge()+" "+""+d1.getCourseName()+" "+d1.getTeacher()) ).collect(Collectors.toList());
   list.forEach( System.out::println);