代码之家  ›  专栏  ›  技术社区  ›  uma

如何将下面的方法转换为Java 8内联函数?

  •  6
  • uma  · 技术社区  · 6 年前

    我需要在下面的方法中转换Java 8的内联函数。要做到这一点,需要一些专家的帮助和解释。

    @Override
    public boolean a(final Collection<DoseDetailMutableDTO> detailModels) {
        for (DoseDetailMutableDTO dd : detailModels) {
             final boolean doseDetailTextScheduled = isDoseDetailTextScheduled(dd, 1);
             if (doseDetailTextScheduled) {
                 return true;
             }
        }
        return false;
    }
    

    还有什么捷径可以做到这一点吗?

    3 回复  |  直到 6 年前
        1
  •  8
  •   Naman    6 年前

    你可以利用 Stream.anyMatch AS:

    public boolean a(final Collection<DoseDetailMutableDTO> detailModels) {
        return detailModels.stream()
                           .anyMatch(dd -> isDoseDetailTextScheduled(dd, 1));
    }
    

    收益率 true 如果流中的任何元素与提供的谓词匹配,则为 false

    编辑 :(来自注释)

    在intellij思想上学习此类建议快捷方式的控件是 Ctrl+Space 或者在MacOS上可以使用 Alt+Enter 也。

        2
  •  5
  •   Tim Biegeleisen    6 年前

    我们可以在这里尝试使用流:

    @Override
    public boolean a (final Collection<DoseDetailMutableDTO> detailModels) {
        return detailModels.stream()
                   .filter(x -> isDoseDetailTextScheduled(x, 1))
                   .findFirst()
                   .orElse(false);
    }
    

    事实上,你的方法 null 如果输入列表可能是 无效的 ,我们可以尝试:

    @Override
    public boolean a (final Collection<DoseDetailMutableDTO> detailModels) {
        return Optional.ofNullable(detailModels)
                       .map(Collection::stream)
                       .orElseGet(Stream::empty)
                       .filter(x -> isDoseDetailTextScheduled(x, 1))
                       .findFirst()
                       .orElse(false);
    }
    
        3
  •  2
  •   fastcodejava    6 年前

    你可以使用 anyMatch 为此。 因为函数的第二个参数是常量,所以可以编写一个调用 isDoseDetailTextScheduled . 我认为它变得更加简洁:

    public boolean a(final Collection<DoseDetailMutableDTO> detailModels) {
       return detailModels.stream().anyMatch(this::isDoseDetailTextScheduledOne);
    }
    
    public boolean isDoseDetailTextScheduledOne(DoseDetailMutableDTO dto) {
        return isDoseDetailTextScheduled(dto, 1);
    }