尽早终止Iterable.forEach

时间:2014-06-14 02:57:19

标签: java lambda java-8 iterable

我有一套和方法:

private static Set<String> set = ...;
public static String method(){
    final String returnVal[] = new String[1];
    set.forEach((String str) -> {
        returnVal[0] += str;
        //if something: goto mark
    });
    //mark
    return returnVal[0];
}

我可以在lambda中终止forEach(使用或不使用异常)吗? 我应该使用匿名课吗?

我可以这样做:

set.forEach((String str) -> {
     if(someConditions()){
         returnVal[0] += str;
     }
});

但是浪费时间。

使用stream.reduce实现

return set.parallelStream().reduce((output, next) -> {
    return someConditions() ? next : output;
}).get(); //should avoid empty set before

我正在寻找最快的解决方案,因此异常和真实的解决方案如果它们足够快,每个循环都是可以接受的。

1 个答案:

答案 0 :(得分:6)

即使我不完全确定你想要完成什么,我也不愿回答这个问题,但简单的答案是 no ,你无法终止{{1}当它处理元素的中途时。

The official Javadoc表明它是一个适用于流中所有元素的终端操作。

  

对此流的每个元素执行操作。

     

这是终端操作。

如果您想将结果收集到一个结果中,则需要使用reduction

请务必考虑流正在做什么。它正在对其中包含的所有元素进行操作 - 如果它在过程中被过滤,则可以说链中的每个步骤都作用于其流中的所有元素,即使它是原始元素的子集


如果您对为什么只是简单地放置forEach感到好奇,那么这就是return的实现。

forEach

明确传入消费者,这与完成的实际迭代无关。我想你可以抛出一个异常,但是当可能存在更优雅的解决方案时,这会很俗气。