java - 用 break 重写循环为 lambda

标签 java lambda java-8

我有一个计数器循环:

List<Mt4Report> history = ...
int counter = 0;
for (Mt4Report item : history) {
    if (item.getProfit().compareTo(BigDecimal.ZERO) < 0) {
        counter++;
    } else {
        break;
    }
}

我如何用 lambda 表达式写出相同的想法 .findFirst().ifPresent 但保留 break 语句?

最佳答案

对于 Java-9 及更高版本,您可以使用 takeWhile 方法:

int counter = (int) history.stream()
        .takeWhile(item -> item.getProfit().compareTo(BigDecimal.ZERO) < 0)
        .count();

对于 Java-8 解决方案,您可以查看 this answer 中提供的 takeWhile 的自定义实现。 .另一方面,使用 indexOf 的低效实现可能是执行:

int count = history.stream()
        .filter(ite -> ite.getProfit().compareTo(BigDecimal.ZERO) >= 0)
        .findFirst()
        .map(history::indexOf)
        .orElse(history.size());

正如 Holger 建议改进上述解决方案,您可以将 IntStreamfindFirst 一起使用:

int count = IntStream.range(0, history.size())
                     .filter(ix -> history.get(ix).getProfit() .compareTo(BigDecimal.ZERO) >= 0)
                     .findFirst()
                     .orElse(history.size());

关于java - 用 break 重写循环为 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58754577/

相关文章:

java - 有没有更好的方法在不使用反射的情况下从对象克隆值?

java - 在 JavaFX 8 中防止中间绑定(bind)被垃圾收集的推荐方法是什么

java - 当两个接口(interface)有冲突的返回类型时,为什么一个方法成为默认方法?

Java,从文件创建 double 字符串数组时遇到问题

java - 模棱两可的方法调用未通过转换解决

java - Mockito 的列表问题

java - Netbeans 8.0.2安装 native 库错误

amazon-web-services - 通过 AWS CLI 使用 Lambda 时出现 AccessDeniedException

c++ - C++ 中带有输入函数的 Lambda auto 给出错误

可以将 C++11 lambda 分配给签名不正确的 std::function