给定以下字符串列表:
现在我想找到与模式
为什么会这样呢?似乎Patter.asPredicate生成的谓词接受部分匹配。在Pattern API中有等价的方法吗?documentation只说了这个:
创建一个可以用来匹配字符串的谓词。
我本以为它是典型的
List<String> progLangs = Arrays.asList("c#", "java", "python", "scala");
还有一个正则表达式模式,应该匹配4个小写字母字符串。
Pattern p = Pattern.compile("[a-z]{4}");
现在我想找到与模式
p
匹配的 progLangs
元素。
按照旧的方法进行:
for (String lang : progLangs) {
if (p.matcher(lang).matches()) {
System.out.println(lang);
}
}
我得到了预期的结果:
java
但是当我尝试使用Java 8的流并使用Pattern.asPredicate将模式转换为谓词时,情况就不同了:
progLangs.stream()
.filter(p.asPredicate())
.forEach(System.out::println);
结果是:
java
python
scala
为什么会这样呢?似乎Patter.asPredicate生成的谓词接受部分匹配。在Pattern API中有等价的方法吗?documentation只说了这个:
创建一个可以用来匹配字符串的谓词。
我本以为它是典型的
Pattern.matcher(String).matches()
,但实际上不是......如何解释这种不一致性呢?
matches
可用,您的初始代码实现了您想要的功能,只是方法调用发生了变化。 :) - Naman