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

时间:2020-01-30 05:02:23

标签: java java-8 java-stream

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

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

我想按学生比较这两个列表中的对象。我必须比较列表并从下面获取数据

  1. 我需要创建一个新列表,其中包含ClassObj中存在的list1对象,而list2中没有这些对象
  2. 我需要创建一个新列表,其中包含ClassObj中存在的list2对象,而list1中没有这些对象
  3. 我需要创建一个新列表,其中包含两个列表中都存在的ClassObj对象 使用java8流

我尝试了以下代码

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

要查找新的入场证(存在于list2中,但不在list1中)

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 个答案:

答案 0 :(得分:2)

您可能根本不需要 $response = $this->client->post('https://grapqlEndPoint', [ 'form_params' => [ 'query' => ' query($username: String!) { users(username: $username) { username } }', 'variables' => [ 'username' => $username ] ] ]); echo $response->getBody()->getContents(); 来完成该任务。怎么样-

Stream

答案 1 :(得分:1)

对于这两个列表的第3部分共同要素

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

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

对于第1部分和第2部分,您需要重写ClassObj中的equals和hashcode方法。 因此,您可以使用列表的包含方法。 ArrayList's custom Contains method

List<ClassObj> studentsGotTC = prevYearList.stream()
                    .filter(prevYear-> currList.contains(prevYear))
                    .collect(Collectors.toList());