【问题标题】:How to iterate a list and check for match如何迭代列表并检查匹配
【发布时间】:2021-10-29 14:02:52
【问题描述】:

我有一个对象

public class QuestionDetails {

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

我将 SubQuestion 声明为

public class SubQuestion{

    private List<SubQuestion> childQuestions;
    private Long questionId;

}

我从用户那里获取问题 ID 作为“questionId”,从 DB 获取 QuestionDetails 对象。

逻辑

我想将用户的 questionId 与 subQuestions 列表中的 questionId 进行比较,以获取 subQuestions 对象,如果我没有找到任何匹配项,那么我想去同一个 subQuestions 对象中的 childQuestions 以查看 childQuestions 列表是否有任何匹配项。如何我可以在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));

【问题讨论】:

  • 你为什么要new Long()
  • 我正在使用 new Long() 以便我可以使用 equals() 方法进行比较
  • 原始比较有什么问题?
  • “我还没试过”——所以你开始是用一个不必要的复杂表达式而不是一个直截了当的表达式?考虑到值 are 在您使用 new Long(…) 之前已经是 Long 类型,这就更奇怪了,这会将它们拆箱到 long,再次将它们装箱到 Long。顺便说一下,newLong(questionId) 处缺少一个空格。此外,你没有问任何问题。
  • 所以你的问题是?简化这段代码还是别的什么?

标签: java arraylist java-8


【解决方案1】:

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

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 的第二个流只会在第一个流没有遇到匹配时处理。

long 用于questionId 类型可确保== 运算符比较值而不是对象标识,而不管getQuestionId() 是返回Long 还是long

【讨论】:

    猜你喜欢
    • 2018-07-27
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 2015-09-29
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多