如何迭代列表并检查匹配

How to iterate a list and check for match

我有对象

public class QuestionDetails {

    private List<SubQuestion> subQuestions;
    private Long questionId;
}

并且我将 SubQuestion 声明为

public class SubQuestion{

    private List<SubQuestion> childQuestions;
    private Long questionId;

}

我从用户那里得到问题 ID 作为“questionId”,从数据库中得到 QuestionDetails 对象。

逻辑

我想将用户的问题 ID 与 subQuestions 列表中的 questionId 进行比较,以获取 subQuestions 对象,如果我没有找到任何匹配项,那么我想转到同一 subQuestions 对象中的 childQuestions 以查看 childQuestions 列表是否有任何 match.How 我可以在 java8 中这样做吗? 现在我正在做的是,我首先检查所有子问题,如果我没有找到任何匹配项,那么我正在调查所有子问题。我的代码如下

Long questionId = dto.getQuestions().get(0).getQuestionId ();
     subQuestion= questionDetails.getSubQuestions().stream()
            .filter(sub -> (new Long(sub.getQuestionId()).equals(new Long(questionId))))
            .findAny() .orElse(questionDetailsDTO.getSubQuestions().stream()
                    .flatMap(sub -> sub.getChildQuestions().stream())
                    .filter(child -> (new Long(child.getQuestionId()).equals(newLong(questionId))))
                    .findFirst()
                    .orElse(null));

假设您想要一个简化的解决方案,您可以使用

long questionId = dto.getQuestions().get(0).getQuestionId();
SubQuestion subQuestion = Stream.concat(
      questionDetails.getSubQuestions().stream(),
      questionDetails.getSubQuestions().stream()
          .flatMap(sub -> sub.getChildQuestions().stream())
    )
    .filter(sub -> sub.getQuestionId() == questionId)
    .findFirst().orElse(null);

由于 findFirst() 尊重遇到的顺序并且流是惰性的,使用 flatMap 的第二个流将仅在第一个流没有遇到匹配项时被处理。

questionId 的类型使用 long 可确保 == 运算符比较值而不是对象标识,无论是否 getQuestionId() returns Longlong.