我正在尝试根据条件过滤列表。是否有其他方法可以中断 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”?
2 回答
一只名叫tom的猫
TA贡献1906条经验 获得超3个赞
您可以使用takeWhile
Java9 中的运算符来完全满足您的需要。它看起来是这样的。
List<String> res = list.stream() .takeWhile(s -> s.startsWith("F")) .collect(Collectors.toList());
白板的微信
TA贡献1883条经验 获得超3个赞
这是使用 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))));
添加回答
举报
0/150
提交
取消