我有一套和一个方法:
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];
}
Run Code Online (Sandbox Code Playgroud)
我可以在lambda中终止forEach(使用或不使用例外)吗?我应该使用匿名课吗?
我能做到这一点:
set.forEach((String str) -> {
if(someConditions()){
returnVal[0] += str;
}
});
Run Code Online (Sandbox Code Playgroud)
但是浪费时间.
使用stream.reduce实现
return set.parallelStream().reduce((output, next) -> {
return someConditions() ? next : output;
}).get(); //should avoid empty set before
Run Code Online (Sandbox Code Playgroud)
我正在寻找最快的解决方案,因此如果它们足够快,那么每个循环的异常和"真实"是可以接受的.
假设我有一个Queue<String>,我想清空队列的当前内容并对每个元素做一些事情。使用循环我可以做类似的事情:
while (true) {
String element = queue.poll();
if (element == null) {
return;
}
System.out.println(element);
}
Run Code Online (Sandbox Code Playgroud)
这感觉有点丑。我可以用流做得更好吗?
请注意,可能有其他线程同时访问队列,因此依赖队列的大小来知道要轮询的项目数量很容易出错。
我正在尝试根据条件过滤列表。是否有其他替代方法可以中断Java 8流以停止过滤?
举个例子:假设我有以下列表。
List<String> list = Arrays.asList("Foo","Food" ,"Fine","Far","Bar","Ford","Flower","Fire");
list.stream()
.filter(str -> str.startsWith("F")) //break when str doesn't start with F
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
我希望从头开始以“ F”开头的所有字符串,一旦找到不以“ F”开头的字符串,我想停止过滤。没有流,我将执行以下操作:
List<String> result = new ArrayList<>();
for(String s : list){
if(s.startsWith("F")){
result.add(s);
}
else{
break;
}
}
Run Code Online (Sandbox Code Playgroud)
如何在信息流中使用“中断”?
这个Java代码可以用Stream API重写吗?
while (true) {
...
if (isTrue()) break;
}
private boolean isTrue() {
...
Run Code Online (Sandbox Code Playgroud)