为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 250 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号