是否有等效于中断 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))));