如何在Java中比较两个列表之间的内部字段



我有List<MainClass> list1List<MainClass> list2

public class MainClass {
private List<Question> questions;
}
public class Question {
private Long questionId;
}

我需要将列表1中的questionId与列表2中的questionId进行比较。我应该从清单1中获得清单2中没有的那些questionId(作为List<Long> ids(。

我已经编写了下一个代码,分别从list1和list2获得id。然后,我必须比较idsFromList1和idsFromList 1,以找出缺少的Id。我的问题是:从List1中获得那些在List2中没有的questionId(作为Listid(的方法是使用流还是以某种简短、优雅的方式?

List<Long> idsFromList1= list1.stream().map(mc->mc.getQuestion)).flatMap(List::stream).map(q->q.getQuestionId()).collect(Collectors.toList());
List<Long> idsFromList2= list2.stream().map(mc->mc.getQuestion)).flatMap(List::stream).map(q->q.getQuestionId()).collect(Collectors.toList());

是的,可以向list1的问题ID中的Stream添加filter()调用,其中谓词将检查list2的元素,如果它们都没有当前ID,则返回true

List<Long> diff = list1.stream()
.flatMap(mc->mc.getQuestions().stream()
.map(Question::getQuestionId))
.filter(id1 -> list2.stream()
.flatMap(mc->mc.getQuestions().stream()
   .map(Question::getQuestionId))
.noneMatch(id2 -> id2.equals(id1)))
.collect(Collectors.toList());

然而,这将需要二次方时间来运行。

如果你生成两个问题ID的Set,并找到区别,你会更好:

Set<Long> idsFromList1 = list1.stream()
.flatMap(mc->mc.getQuestions().stream().map(Question::getQuestionId))
.collect(Collectors.toSet());
Set<Long> idsFromList2= list2.stream() .flatMap(mc->mc.getQuestions().stream().map(Question::getQuestionId))
.collect(Collectors.toSet());
Set<Long> diff = idsFromList1.removeAll(idsFromList2);

最新更新