2 回答

TA贡献1829条经验 获得超9个赞
Matcher
不是线程安全的但是Pattern
是。
关于asPredicate()
您可以认为它是线程安全的,因为 Pattern
javadoc 类本身被定义为可以安全地供多个并发线程使用:
此类的实例是不可变的,可以安全地供多个并发线程使用。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()).(...);

TA贡献1862条经验 获得超7个赞
Matcher
没有办法asPredicate
;就是Pattern
这样。因此,返回的Predicate
也是线程安全的——它将作为新的 Matcher
返回,它将Predicate
被构建——因为文档说它是不可变的。
添加回答
举报