【问题标题】:Java - using streams to get list elements with a certain propertyJava - 使用流获取具有特定属性的列表元素
【发布时间】:2021-03-15 22:30:14
【问题描述】:

我有两个名为 SchoolStudent 的班级、一组学校、一个学生列表和两张地图,其中包含学校在学生方面的偏好,反之亦然:

Set<School> schoolSet = new TreeSet<>();
Collections.addAll(schoolSet, schools);

List<Student> studentList = new LinkedList<>(Arrays.asList(students));

Map<School, List<Student>> schoolPrefMap = new TreeMap<>();
Map<Student, List<School>> stdPrefMap = new HashMap<>();

我正在使用不同的实现,因为这是我必须完成的任务之一。

我正在尝试使用 java 流创建一个查询,该流从集合中返回以某个学生为最高优先级的学校,因此该学生的索引在该特定学校键的值列表中应该为 0 .

我有一个尝试类似的例子,只让至少有特定学校的学生在他的偏好中

List<School> target = Arrays.asList(schools[0], schools[2]);

List<Student> result = studentList.stream()
        .filter(std -> stdPrefMap.get(std).containsAll(target))
        .collect(Collectors.toList());

我如何使用流来获取以特定学生为首选的学校?

【问题讨论】:

    标签: java java-stream


    【解决方案1】:

    这应该完成你指定的:

    Student target = ...
    schoolSet.stream()
            .filter(school -> {
                List<Student> preferredStudents = schoolPrefMap.get(school);
                return !preferredStudents.isEmpty() && preferredStudents.get(0).equals(target);
            }).collect(Collectors.toList());
    

    请问您为什么不使用 Map> 和 Map> (因为它非常适合这种带有额定偏好和使用 contains( ) / containsAll() 对一个列表不是很有效)?

    在这种情况下,您的代码将如下所示:

    schoolSet.stream()
            .filter(school -> {
                Queue<Student> preferredStudents = schoolPrefMap.get(school);
                return !preferredStudents.isEmpty() && preferredStudents.peek().equals(target);
            }).collect(Collectors.toList());
    

    【讨论】:

      【解决方案2】:

      希望对您有所帮助:

              List<School> schoolsWithTargetedStudentAsTopPref = schoolSet.stream()
                  .filter(school -> schoolPrefMap.get(school).stream()
                          .findFirst()
                          .filter(student-> student.equals(target))
                          .map(optionalSchool -> !optionalSchool.isEmpty())
                          .get())
                  .collect(Collectors.toList());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-16
        • 2023-01-19
        • 1970-01-01
        • 2012-03-03
        • 1970-01-01
        • 1970-01-01
        • 2016-03-09
        相关资源
        最近更新 更多