【问题标题】:Java8 - filter Parent list based on the condition in Child list using Streams & lambdaJava8 - 使用 Streams & lambda 根据子列表中的条件过滤父列表
【发布时间】:2018-02-19 21:04:58
【问题描述】:

我想根据子列表中的条件过滤父列表。这里父列表是列表,子列表是列表。我想获取第一科成绩大于等于70的学生名单。

        // College Class which has list of students.           
        public class College {
            private long collegeId;
            private List<Student> students;
         }

        // Student class which has list of subjects.
        public class Student {
            private long studentId;
            private List<Subject> subjects;
        }

        // Subject class.
        public class Subject {
            private long subjectId;
            private String subjectName;
            private long marks;
        }

现在我想获取所有第一科成绩>70 的学生名单。

我正在尝试类似下面的东西;但得到“java.lang.ArrayIndexOutOfBoundsException:27745”。

        List<Student> distinctionStudents = college.getStudents().stream().filter(s -> s.getSubjects().get(0).getMarks()>=70).collect(Collectors.toList());

不知道如何完成。

提前谢谢大家。

【问题讨论】:

  • 看起来这段代码不应该产生这个期望。还有别的事。发布MCVE

标签: java filter java-stream


【解决方案1】:

试试下面这个:

    List<Student> list = students.stream()
            .filter(student -> !student.getSubjects().isEmpty())
            .filter(student ->
                    student.getSubjects().stream().findFirst().get().getMarks() >= 70)
            .collect(Collectors.toList());

例如,对于以下学生列表:

    List<Student> students = new ArrayList<>();
    students.add(new Student(1, new ArrayList<>()));
    students.add(new Student(1, Arrays.asList(
            new Subject(1, "A", 67),
            new Subject(2, "B", 76))));
    students.add(new Student(2, Arrays.asList(
            new Subject(1, "A", 99),
            new Subject(3, "C", 77))));

输出将是(当然对于提供的正确方法,例如toString):

list = [Student{studentId=2, subjects=[Subject{subjectId=1, subjectName='A', marks=99}, Subject{subjectId=3, subjectName='C', marks=77}]}]

【讨论】:

  • 非常感谢您的快速回复。但是我仍然收到 java.lang.ArrayIndexOutOfBoundsException: 27745。当我注释掉两个过滤器时;也不例外;但是当我取消注释任何一个 .filter 时,我得到以下异常。严重:Web 应用程序 [/FlightAvailabilityPredictor] 中的 Servlet [jersey-serlvet] 引发 load() 异常 java.lang.ArrayIndexOutOfBoundsException: 27745
  • 我也试过那个代码。结果相同。不确定这是否与代码有关;我使用的是 jersey-client 1.8 版本;它与泽西图书馆有关吗?
  • @Hruday 这个问题摘自泽西。显然你问的是纯粹的名单,没有提到球衣:)
  • 我的错;我不知道这可能是因为球衣
【解决方案2】:

我找到了答案;我使用的是 Jersey 1.8 库;并且已经移到下面并且它已经工作了。

<!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-bundle -->
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-bundle</artifactId>
    <version>1.19.2</version>
</dependency>

谢谢大家之前的时间。它帮助我改进了我的代码。

【讨论】:

  • 很遗憾您没有更清楚地说明您的问题。至少,请详细描述您的问题以及您如何解决(对于其他人):)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
  • 2017-08-28
  • 2017-03-09
  • 2022-10-07
相关资源
最近更新 更多