Java 8+ 流中是否有等效的中断?

我正在尝试根据条件过滤列表。是否有其他方法可以中断 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”?


慕沐林林
浏览 121回答 2
2回答

一只名叫tom的猫

您可以使用takeWhileJava9 中的运算符来完全满足您的需要。它看起来是这样的。List<String>&nbsp;res&nbsp;=&nbsp;list.stream() &nbsp;&nbsp;&nbsp;&nbsp;.takeWhile(s&nbsp;->&nbsp;s.startsWith("F")) &nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toList());

白板的微信

这是使用 Java 8 的一个选项:AtomicBoolean&nbsp;keepAdding&nbsp;=&nbsp;new&nbsp;AtomicBoolean(true); list.stream() &nbsp;&nbsp;&nbsp;&nbsp;.peek(s&nbsp;->&nbsp;keepAdding.set(keepAdding.get()&nbsp;&&&nbsp;s.startsWith("F"))) &nbsp;&nbsp;&nbsp;&nbsp;.filter(s&nbsp;->&nbsp;keepAdding.get());还有另一种可能性,从评论中可以明显看出上述方法不受青睐:list.subList(0,&nbsp;list.indexOf(list.stream().filter(s&nbsp;->&nbsp;!s.startsWith("F")) &nbsp;&nbsp;&nbsp;&nbsp;.findFirst() &nbsp;&nbsp;&nbsp;&nbsp;.orElse(list.get(list.size()&nbsp;-&nbsp;1))));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java