【问题标题】:How to convert for each loops into Java streams and lambda function?如何将每个循环转换为 Java 流和 lambda 函数?
【发布时间】:2021-11-04 22:31:56
【问题描述】:

我在 Java 中有一个用例,我需要根据另一个列表(比如 y)的 id 填充其中一个列表(比如 x)并从该列表中获取结果。

List<LightRecruiterScholarResponse> responses = eventScholarRepository.findScholarDetailsByEventId(eventId);
List<InterviewDto> interviewResults = interviewRepository.getInterviewResultByRoundIdAndScholarId();

for (LightRecruiterScholarResponse response : responses) {
    String val = null;

    for (InterviewDto dto : interviewResults) {
        if (dto.getId().equals(response.getScholarId())) {
            val = dto.getInterviewResult();
            break;
        }
    }

    response.setInterviewStatus(val);
}

【问题讨论】:

标签: java java-stream


【解决方案1】:

这可以直接完成:

List<LightRecruiterScholarResponse> responses =
         eventScholarRepository.findScholarDetailsByEventId(eventId);
List<InterviewDto> interviewResults =
         interviewRepository.getInterviewResultByRoundIdAndScholarId();

responses.forEach(response -> response.setInterviewStatus(
                 interviewResults.stream()
                        .filter(dto -> dto.getId().equals(response.getScholarId()))
                        .map(InterviewDto::getInterviewResult)
                        .findFirst().orElse(null)));

这不是很有效,因为您对每个response 迭代interviewResults。要修复它,您可以构建 Map 并使用它:

List<LightRecruiterScholarResponse> responses =
         eventScholarRepository.findScholarDetailsByEventId(eventId);
Map<String, String> interviewResults =
         interviewRepository.getInterviewResultByRoundIdAndScholarId().stream()
                    .collect(Collectors.toMap(InterviewDto::getId,
                                              InterviewDto::getInterviewResult)); 
responses.forEach(response ->
   response.setInterviewStatus(interviewResults.get(response.getScholarId())));

【讨论】:

  • @oleg.cherednik 我尝试了第一种方法,但它似乎给出了 NulPointerException。基本上,我需要为名为response 的列表设置interviewResult 字段,并从方法中返回该列表。
  • @oleg.cherednik 在我的用例中,可能存在 getInterviewResult 方法返回多个空值的情况。
【解决方案2】:

你可以使用:

Map<String, String> map = interviewResults.stream()
      .collect(Collectors.toMap(InterviewDto::getId, InterviewDto::getInterviewResult));

responses.forEach(response ->
        response.setInterviewStatus(
                map.getOrDefault(response.getScholarId(), null)));

这个想法是为键创建一个Id 的映射,为值创建一个InterviewResult,然后为responses 中的每个元素设置InterviewStatus,您可以通过ScholarId 在映射中找到它可以替换if (dto.getId().equals(response.getScholarId()))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 2017-02-09
    相关资源
    最近更新 更多