如何使用Java 8 lambdas将对象添加到另一个列表中的列表中

时间:2017-07-21 12:43:37

标签: java lambda java-8 java-stream

我怀疑如何使用Java 8 lambdas将对象添加到另一个列表中的列表中。

让我解释一下:

我有以下对象:

类对象:

public class Course{

   private String courseNae;
   private List<Student> studentList;

   /*gets and sets */

}

学生对象:

public class Student{

   private String studentName;
   private List<Subject> subjectList;

       /*gets and sets */
}

主题对象:

public class Subject{

   private String subjectName;
   private String details;
   private double value;

       /*gets and sets */
}

我想这样做但是使用java 8 lambda:

 for(Class course: this.courseList){
        for(Student std: course.getStudentList()){
            if(std.getStudentName().equals(name)) {
                std.getSubjectList()
                        .add(Subject.newBuilder()
                        .subjectName(infoName)
                        .details("fofofofof")
                        .value(10.0)
                        .build());
            }
        }
    }

一般情况下:   - 我想在我的课程列表

中找到这个名字
  • 一旦我找到学生姓名,我想添加一个新的主题信息 在主题列表中。

1 个答案:

答案 0 :(得分:2)

这可能是您问题的可能解决方案:

<强>代码:

courseList.stream()
          .map(Course::getStudentList)
          .flatMap(Collection::stream)
          .filter(student -> student.getStudentName().equals(name))
          .findFirst()
          .map(Student::getSubjectList)
          .ifPresent(subjectList -> subjectList.add(
              Subject.newBuilder()
                     .subjectName(infoName)
                     .details("fofofofof")
                     .value(10.0)
                     .build())
          );

<强>解释

  • .map(Course::getStudentList)会将输入List<Course>转换为List<Student>
  • 的流
  • .flatMap(Collection::stream)会将给定的List<Student>压缩为Student
  • 的流
  • .filter(...)将过滤流,以便仅流式传输具有匹配名称的学生
  • .findFirst()将找到给定流的第一项
  • .map(Student::getSubjectList)现在将学生流转换为List<Subject>
  • 的流 如果我们找到了匹配的匹配学生,则会执行
  • .ifPresent(...)

注意:

  • 看起来像这样的方法调用:Course::getStudentList是所谓的方法引用。详细了解他们here
  • 了解有关溪流here
  • 的更多信息
  • 详细了解Optional here