Pattern::asPredicate 线程安全吗

Is Pattern::asPredicate thread safe

我在查看 java 8 文档时发现 class Pattern has the method asPredicate.

我正在查看 Whosebug,但没有发现任何与线程安全相关的内容。

我知道模式 class 是线程安全的,正如文档所说

Instances of this class are immutable and are safe for use by multiple concurrent threads. Instances of the Matcher class are not safe for such use.

但是,asPredicate 方法生成的 Predicate 会发生什么?

Matcher没有方法asPredicatePattern 确实如此。因此 returned Predicate 也是线程安全的 - 它会 return 作为 new Matcher Predicate将构建自 - 因为文档说它是不可变的。

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

Instances of this class are immutable and are safe for use by multiple concurrent threads. Instances of the Matcher class are not safe for such use.

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

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()).(...);