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

How do compare an internal field between two lists in Java?

我有 List<MainClass> list1List<MainClass> list2

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

public class Question {
    private Long questionId;
}

我需要比较列表 1 中的问题 ID 和列表 2 中的问题 ID。我应该从 List1 中获取那些在 List2 中不存在的问题 ID(如 List<Long> ids)。

我已经编写了下一个代码,其中我分别从 list1 和 list2 中分别获取 ID。然后我必须比较 idsFromList1 和 idsFromList1 以找出缺少的 ID。我的问题:使用流或以某种简短、优雅的方式从 List1 中获取 List2 中不存在的那些 questionId(作为 List id)的方法是什么?

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 的 Streamfilter() 调用,其中谓词将检查 list2 的元素, 和 return true 如果其中 none 个具有当前 ID。

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

但是,这需要二次方时间 运行。

如果你生成两个 Set 的问题 ID 并找出不同之处,你会更好:

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