Bug in Pattern.asPredicate?
给定以下字符串列表:
List<String> progLangs = Arrays.asList("c#", "java", "python", "scala");
和应匹配 4 个字母小写字符串的正则表达式模式。
Pattern p = Pattern.compile("[a-z]{4}");
现在我想找到适合模式的元素。progLangs
p
以旧的方式做:
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 似乎生成了一个接受部分匹配的谓词。模式 API 中的等效项是什么?文档仅显示:
创建可用于匹配字符串的谓词。
我希望它是典型的,但它是另一回事...如何解释这种不一致?Pattern.matcher(String).matches()