当前位置: 首页 > 知识库问答 >
问题:

使用java8的自定义对象比较列表(流)

熊博远
2023-03-14

我有两个包含该类对象的列表:

public class ClassObj {
    private Integer Id;
    private List<String> students;
}

我想通过学生比较一下那两个列表中的对象。我得比较一下列表然后得到下面的数据

  1. 我需要创建一个新列表,其中包含列表1中存在但不在列表2
  2. 中的 classobj对象
  3. 我需要创建一个新列表,其中包含那些classobj对象,这些对象存在于列表2中,但不存在于列表1
  4. 我需要创建一个新列表,其中包含使用java8流出现在两个列表中的classobj对象

我尝试使用下面的代码

List<ClassObj> prevYearList = getPrevYearData(id);
List<ClassObj> currYearList = getCurrentYearData(id);

查找获得TC的学生(存在于列表1中但不存在于列表2中)

List<ClassObj> studentsGotTC = prevYearList.stream()
                    .filter(curr -> (currYearList.stream().filter(prev -> prev.getStudents().equals(curr.getStudents()))
                            .count()) < 1)
                    .collect(Collectors.toList());

查找新的许可(存在于清单2中,但不存在于清单1中)

List<ClassObj> newAdmission = currYearList.stream()
                    .filter(prev -> (prevYearList.stream()
                            .filter(curr -> prev.getStudents().equals(curr.getStudents())).count()) < 1)
                    .collect(Collectors.toList());

查找继续留在学校的学生(在两个列表中都存在)

List<List<String>> studentsList = studentsGotTC.parallelStream()
                    .map(ClassObj::getStudents)
                    .collect(Collectors.toList());
List<ClassObj> existingStudents = prevYearList.stream()
                    .filter(e -> !studentsList.contains(e.getStudents()))
                    .collect(Collectors.toList());

它返回给我正确的结果,但我不想通过两个流和筛选数据,如何优化上面的代码有效。即,通过使用单个流

共有2个答案

姬天宇
2023-03-14

对于第3部分,这两个列表中的公共元素

Set<String> result = list.stream()
  .distinct()
  .filter(otherList::contains)
  .collect(Collectors.toSet());

之后,您可以将集合更改为列表。

对于第1部分和第2部分,您需要重写classobj中的equals和hashcode方法。因此,您可以使用列表的包含方法。ArrayList的自定义包含方法

List<ClassObj> studentsGotTC = prevYearList.stream()
                    .filter(prevYear-> currList.contains(prevYear))
                    .collect(Collectors.toList());
尉迟明贤
2023-03-14

对于该任务,您可能根本不需要streams。不如这样-

Set<ClassObj> uniqueStudentsOfPrevYear = new HashSet<>(prevYearList);
Set<ClassObj> uniqueStudentsOfCurrYear = new HashSet<>(currYearList);

List<ClassObj> studentsWithTC = new ArrayList<>(prevYearList);
studentsWithTC.removeIf(uniqueStudentsOfCurrYear::contains);

List<ClassObj> newAdmissions = new ArrayList<>(currYearList);
newAdmissions.removeIf(uniqueStudentsOfPrevYear::contains);

List<ClassObj> overlapping = new ArrayList<>(currYearList);
overlapping.retainAll(uniqueStudentsOfPrevYear);
 类似资料:
  • 要做到这一点,最干净的捷径是什么? 我知道它可以通过自定义比较器来实现。对于这种情况,难道没有现成的东西吗? 有点像这样:

  • 问题内容: 我知道有几个这样的问题,但是它们似乎对我没有用。 我有一个列表,5元素乘以50。我想通过对每个元素应用自定义比较功能来对列表进行排序。此函数计算要对元素进行排序的列表的适用性。我创建了两个函数,比较和适应性: 和 然后我尝试通过以下方式致电给他们: 要么 要么 要么 我也尝试了具有相同参数的list.sort()。但是无论如何,函数都不会将列表作为参数,而是作为参数。我不知道为什么,这

  • 我有以下代码: 现在,我有两个房屋列表和,这两个列表都填充了相同的房屋元素,但是嵌套的列表房屋任务在newHouse中更新了一个额外的任务。 如何获得一个新的列表,该列表包含通过Java8流添加的任务? 这一直在破坏我的大脑,我似乎无法让它工作。

  • 我有以下清单: 这是我的比较器函数: 我正在尝试使用它排序如下: 我不明白为什么第一个NaN不在列表的末尾。 我对升序排序列表的预期输出是: 我对降序排序列表的预期输出是: 在升序排序和降序排序的情况下,我希望NaNs在最后。 我知道sortwith使我们能够编写自己的比较器。有人能帮我吗?

  • 如何使用Comparator对对象的ArrayList进行正确排序,然后将排序后的数组传递给自定义数组适配器? 我试过这样做: ArrayList的内容类: 比较器: 在OnCreate中设置适配器: ...因为我使用的是定制的ArrayAdapter,就像: 我需要如何修改此适配器以使其与其他适配器一起工作? 谢谢你的帮助。

  • 我有一个要求,我需要根据2个条件从另一个列表中创建一个对象列表。对象应处于会话中或处于活动状态。[这个问题与使用java8流从另一个对象创建对象列表有着模糊的联系 主要类别: 任何帮助都将不胜感激。