Matcher
is not thread safe but Pattern
is.
About asPredicate()
you can consider it thread safe as the Pattern
javadoc class itself is defined as safe for use by multiple concurrent threads :
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.
As underlined by Holger, the Predicate
returned by Pattern.asPredicate()
is not documented as thread safe (nor the reverse) but the implementation of it proves that it is :
public Predicate<String> asPredicate() {
return s -> matcher(s).find();
}
Pattern.asPredicate()
is just another way to do a match between a String
against a pattern similarly to Pattern.matcher(CharSequence).find()
.
This :
boolean isFound = pattern.matcher(myString).find();
can be done in this way :
boolean isFound = pattern.asPredicate().test(myString);
So here the new thing is that you can pass the predicate in a stream or any method that accepts a predicate. Which makes the intention really clearer : not need to manipulate a Pattern
but a Predicate
.
Pattern pattern = ...;
...stream().filter(o-> pattern.matcher(o).find());
can be replaced by :
Predicate<String> predicate = pattern.asPredicate();
List<String> strings = ...;
strings.stream().filter(predicate).(...);
//or
strings.stream().filter(pattern.asPredicate()).(...);