我正在嘗試根據(jù)條件過濾列表。是否有其他方法可以中斷 java 8 流來停止過濾?舉個(gè)例子:假設(shè)我有以下列表。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ā)現(xiàn)不以“F”開頭的字符串,我想停止過濾。如果沒有流,我會(huì)執(zhí)行以下操作:List<String> result = new ArrayList<>();for(String s : list){ if(s.startsWith("F")){ result.add(s); } else{ break; }}如何在流中使用“break”?
2 回答

一只名叫tom的貓
TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超3個(gè)贊
您可以使用takeWhile
Java9 中的運(yùn)算符來完全滿足您的需要。它看起來是這樣的。
List<String> res = list.stream() .takeWhile(s -> s.startsWith("F")) .collect(Collectors.toList());

白板的微信
TA貢獻(xiàn)1883條經(jīng)驗(yàn) 獲得超3個(gè)贊
這是使用 Java 8 的一個(gè)選項(xiàng):
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))));
添加回答
舉報(bào)
0/150
提交
取消