如何迭代列表并检查匹配
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 Long
或 long
.
我有对象
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 Long
或 long
.