2017-04-09 125 views
6

我想查找一個字符串流是否至少有一個出現在Set<String>中的另一個String。我想出了兩個解決方案。Java Streams:filter()。count()vs anyMatch()

表現明智,哪種方法最好/推薦?

1)

return source.stream().filter(this::streamFilter).count() > 0; 

2)

return source.stream().anyMatch(this::streamFilter); 

這裏的streamFilter方法:

private boolean streamFilter(String str) { 
    return filterKeywords.contains(str.toLowerCase()); 
} 

filterKeywords:private Set<String> filterKeywords;

或者有更好的AP比這個更進步?

+3

#2,因爲當結果是確定的時它停止搜索。正如javadoc所說:*這是一個[** short-circuit **終端操作](https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html #StreamOps)。* – Andreas

+0

@Andreas我也這麼認爲,想要確定:) – dazito

+0

請參見[Java 8 findFirst()。isPresent()比count()> 0更有效嗎?](https://stackoverflow.com/q /2711488分之39713964) – Holger

回答

11

你應該使用anyMatch(this::streamFilter),看看API下面(重點煤礦)作爲它不會評估所有元素,其中爲count()明顯迭代元素的全碼流流的anyMatch方法。

返回此流的任何元素是否與提供的 謂詞匹配。 如果不是 確定結果,則不能評估所有元素的謂詞。如果流爲空,則返回false,並且不評估謂詞。

點是一些流方法,如findFirst()anyMatch()findAny()等。執行短路操作即他們不評價流中的所有元素,你可以參考here瞭解更多詳情。

1

anyMatch並不總是執行所有的流。這是最好的方法。

相關問題