亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Pattern::asPredicate 線程安全嗎

Pattern::asPredicate 線程安全嗎

慕哥6287543 2023-03-23 15:24:25
我正在檢查 java 8 文檔,我發現類Pattern有方法asPredicate。我正在查看 StackOverflow,但沒有發現任何與線程安全相關的內容。正如文檔所說,我知道 Pattern 類是線程安全的此類的實例是不可變的,可以安全地供多個并發線程使用。Matcher 類的實例對于此類使用是不安全的。但是,asPredicate 方法生成的 Predicate 會怎樣呢?
查看完整描述

2 回答

?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

Matcher不是線程安全的但是Pattern是。
關于asPredicate()您可以認為它是線程安全的,因為 Patternjavadoc 類本身被定義為可以安全地供多個并發線程使用:

此類的實例是不可變的,可以安全地供多個并發線程使用。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()).(...);


查看完整回答
反對 回復 2023-03-23
?
牧羊人nacy

TA貢獻1862條經驗 獲得超7個贊

Matcher 沒有辦法asPredicate;就是Pattern這樣。因此,返回的Predicate也是線程安全的——它將作為新的 Matcher返回,它將Predicate被構建——因為文檔說它是不可變的。



查看完整回答
反對 回復 2023-03-23
  • 2 回答
  • 0 關注
  • 243 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號