我有一套和方法:
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
我正在寻找最快的解决方案,因此异常和真实的解决方案如果它们足够快,每个循环都是可以接受的。
答案 0 :(得分:6)
即使我不完全确定你想要完成什么,我也不愿回答这个问题,但简单的答案是 no ,你无法终止{{1}当它处理元素的中途时。
The official Javadoc表明它是一个适用于流中所有元素的终端操作。
对此流的每个元素执行操作。
这是终端操作。
如果您想将结果收集到一个结果中,则需要使用reduction。
请务必考虑流正在做什么。它正在对其中包含的所有元素进行操作 - 如果它在过程中被过滤,则可以说链中的每个步骤都作用于其流中的所有元素,即使它是原始元素的子集
如果您对为什么只是简单地放置forEach
感到好奇,那么这就是return
的实现。
forEach
明确传入消费者,这与完成的实际迭代无关。我想你可以抛出一个异常,但是当可能存在更优雅的解决方案时,这会很俗气。