Java 将带中断的循环重写为lambda

Java 将带中断的循环重写为lambda,java,lambda,java-8,Java,Lambda,Java 8,我有一个计数器循环: List<Mt4Report> history = ... int counter = 0; for (Mt4Report item : history) { if (item.getProfit().compareTo(BigDecimal.ZERO) < 0) { counter++; } else { break; } } 列表历史=。。。 int计数器=0; 对于(MT4报告项:历史记录){

我有一个计数器循环:

List<Mt4Report> history = ...
int counter = 0;
for (Mt4Report item : history) {
    if (item.getProfit().compareTo(BigDecimal.ZERO) < 0) {
        counter++;
    } else {
        break;
    }
}
列表历史=。。。
int计数器=0;
对于(MT4报告项:历史记录){
if(item.getProfit().compareTo(BigDecimal.ZERO)<0){
计数器++;
}否则{
打破
}
}

如何使用lambda表达式编写相同的想法something
.findFirst().ifPresent
但是预扣中断语句?

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

int counter = (int) history.stream()
        .takeWhile(item -> item.getProfit().compareTo(BigDecimal.ZERO) < 0)
        .count();
正如霍尔格建议改进上述解决方案一样,您可以使用
IntStream
findFirst

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

根据Java8,这个问题没有直接的解决方案,基本上就是使用
谓词停止

在Java 9中有
takeWhile()
方法,但在Java 8中没有类似的方法。

请参阅

否,此计数为所有比较案例。我的代码只从0索引开始计数,没有任何错误。@Pavel那么你必须参考我答案中的帖子,那里有一些关于这方面的漏洞。是的,好的解决方案非常简洁易读,但对于9版本,我的问题是关于8版本。我认为你的java8代码不正确,因为@Pavel想要找到利润<0的项目,不是>=0。@ahoxha这只是逻辑颠倒了,请注意第一个非拟合元素的
indexOf
。对不起,我的错@Pavel,我想Nama的java8版本就是你要找的版本。
IntStream.range(0,history.size()).filter(ix->history.get(ix).getProfit().compareTo(bigdecim.ZERO)>=0.findFirst().orElse(history.size())
避免在列表中进行第二次线性搜索。我会说,根据java 8,您有了清晰的版本,为什么不基于
item.getProfit().compareTo(BigDecimal.ZER)<0
过滤流,然后调用
count()
?@ahoxha这正是我所做的,但是Pavel要求当
过滤器中的条件为false时,流终止,我在Java 8的上下文中已经回答了这一点。当您使用流时,您不会告诉他们如何执行任务,而是告诉他们执行什么任务。我不确定订单是否重要,但如果要查找利润小于零的所有项目,只需过滤流并调用
count()
。另一方面,如果他在第一个非零项上打破循环(这可能会在列表的后面忽略其他零项),我不理解这个逻辑。@ahoxha这可能是一个失败快速的逻辑,因为您希望所有利润都为零,但即使遇到一个非零项,也只需打破并返回零项的数量
int count = IntStream.range(0, history.size())
                     .filter(ix -> history.get(ix).getProfit() .compareTo(BigDecimal.ZERO) >= 0)
                     .findFirst()
                     .orElse(history.size());