我正在查看Java 8文档,发现类Pattern具有方法asPredicate。
我正在查看StackOverflow,但未发现任何与线程安全相关的信息。
我知道Pattern类是文档所说的线程安全
此类的实例是不可变的,可以安全地被多个并发线程使用。 Matcher类的实例不安全用于此类用途。
但是,使用asPredicate方法生成的谓词会发生什么?
答案 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
的生成依据-因为文档说它是不可变的。