是否为Pattern :: asPredicate线程安全

时间:2019-07-12 07:20:32

标签: java java-8 matcher

我正在查看Java 8文档,发现类Pattern具有方法asPredicate

我正在查看StackOverflow,但未发现任何与线程安全相关的信息。

我知道Pattern类是文档所说的线程安全

  

此类的实例是不可变的,可以安全地被多个并发线程使用。 Matcher类的实例不安全用于此类用途。

但是,使用asPredicate方法生成的谓词会发生什么?

2 个答案:

答案 0 :(得分:3)

Matcher不是线程安全的,但是Pattern是线程安全的。
关于asPredicate(),您可以认为它是线程安全的,因为Pattern javadoc class本身被定义为可以被多个并发线程安全使用:

  

此类的实例是不可变的,可以安全地被多个实例使用   并发线程。 Matcher类的实例不安全   这样的用途。

如Holger所强调的那样,Predicate返回的Pattern.asPredicate()没有被记录为线程安全的(反之亦然),但是它的实现证明是:

public Predicate<String> asPredicate() {
    return s -> matcher(s).find();
}

Pattern.asPredicate()只是在String与类似于Pattern.matcher(CharSequence).find()的模式之间进行匹配的另一种方法。

此:

boolean isFound = pattern.matcher(myString).find(); 

可以通过这种方式完成:

boolean isFound = pattern.asPredicate().test(myString); 

因此,这里的新事物是您可以在流中接受谓词或接受谓词的任何方法。这使意图更加清晰:不需要操纵Pattern,而是操纵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()).(...);

答案 1 :(得分:0)

Matcher 具有方法asPredicate;是Pattern。因此,返回的Predicate也是线程安全的-它会以 new Matcher的形式返回Predicate的生成依据-因为文档说它是不可变的。