是否有等效于中断 Java 8+ 流?
Is there an eqivalent to break in Java 8+ streams?
我正在尝试根据条件过滤列表。有没有其他方法可以中断 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());
我希望所有以"F"开头的字符串从头开始,一旦发现不以"F"开头的字符串我想停止过滤。如果没有流,我会执行以下操作:
List<String> result = new ArrayList<>();
for(String s : list){
if(s.startsWith("F")){
result.add(s);
}
else{
break;
}
}
如何在流中使用 "break"?
您可以在 Java9 中使用 takeWhile
运算符,这正是您需要的。这是它的样子。
List<String> res = list.stream()
.takeWhile(s -> s.startsWith("F"))
.collect(Collectors.toList());
这是一个使用 Java 8 的选项:
AtomicBoolean keepAdding = new AtomicBoolean(true);
list.stream()
.peek(s -> keepAdding.set(keepAdding.get() && s.startsWith("F")))
.filter(s -> keepAdding.get());
还有另一种可能性,因为从评论中可以明显看出上述方法不受青睐:
list.subList(0, list.indexOf(list.stream().filter(s -> !s.startsWith("F"))
.findFirst()
.orElse(list.get(list.size() - 1))));
我正在尝试根据条件过滤列表。有没有其他方法可以中断 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());
我希望所有以"F"开头的字符串从头开始,一旦发现不以"F"开头的字符串我想停止过滤。如果没有流,我会执行以下操作:
List<String> result = new ArrayList<>();
for(String s : list){
if(s.startsWith("F")){
result.add(s);
}
else{
break;
}
}
如何在流中使用 "break"?
您可以在 Java9 中使用 takeWhile
运算符,这正是您需要的。这是它的样子。
List<String> res = list.stream()
.takeWhile(s -> s.startsWith("F"))
.collect(Collectors.toList());
这是一个使用 Java 8 的选项:
AtomicBoolean keepAdding = new AtomicBoolean(true);
list.stream()
.peek(s -> keepAdding.set(keepAdding.get() && s.startsWith("F")))
.filter(s -> keepAdding.get());
还有另一种可能性,因为从评论中可以明显看出上述方法不受青睐:
list.subList(0, list.indexOf(list.stream().filter(s -> !s.startsWith("F"))
.findFirst()
.orElse(list.get(list.size() - 1))));