2 回答

TA貢獻1829條經驗 獲得超9個贊
Matcher
不是線程安全的但是Pattern
是。
關于asPredicate()
您可以認為它是線程安全的,因為 Pattern
javadoc 類本身被定義為可以安全地供多個并發線程使用:
此類的實例是不可變的,可以安全地供多個并發線程使用。Matcher 類的實例對于此類使用是不安全的。
正如 Holger 強調的那樣,Predicate
返回的 byPattern.asPredicate()
沒有記錄為線程安全的(反之亦然),但它的實現證明它是:
public Predicate<String> asPredicate() { return s -> matcher(s).find(); }
Pattern.asPredicate()
String
只是另一種在 a與類似于 的模式 之間進行匹配的方法Pattern.matcher(CharSequence).find()
。
這 :
boolean isFound = pattern.matcher(myString).find();
可以這樣做:
boolean isFound = pattern.asPredicate().test(myString);
所以這里的新事物是您可以在流或任何接受謂詞的方法中傳遞謂詞。這使得意圖更加清晰:不需要操縱 aPattern
而是 a Predicate
。
Pattern pattern = ...; ...stream().filter(o-> pattern.matcher(o).find());
可以替換為:
Predicate<String> predicate = pattern.asPredicate();
List<String> strings = ...;
strings.stream().filter(predicate).(...);
//or
strings.stream().filter(pattern.asPredicate()).(...);

TA貢獻1862條經驗 獲得超7個贊
Matcher
沒有辦法asPredicate
;就是Pattern
這樣。因此,返回的Predicate
也是線程安全的——它將作為新的 Matcher
返回,它將Predicate
被構建——因為文檔說它是不可變的。
添加回答
舉報