我有两个包含此类对象的列表:
public class ClassObj {
private Integer Id;
private List<String> students;
}
我想按学生比较这两个列表中的对象。我必须比较列表并从下面获取数据
ClassObj
中存在的list1
对象,而list2
中没有这些对象ClassObj
中存在的list2
对象,而list1
中没有这些对象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());
它正确返回了我的结果,但是我不想遍历两个流并过滤数据,如何有效地优化上述代码。 即通过使用单个流
答案 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());