我有一个计数器循环:
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 建议改进上述解决方案,您可以将 IntStream
与 findFirst
一起使用:
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/