Java 8基于正则表达式从数组/数组列表中删除项目

Sac*_*lla 5 java java-8

有没有更好的方法来实现java 8中的以下内容?

String regex = "^SACHI";
for (String temp : personalNames ) {
    if (temp.matches(regex)){
         personalNames.remove(temp);
    }
}
Run Code Online (Sandbox Code Playgroud)

Hol*_*ger 8

您可以使用

personalNames.removeIf(Pattern.compile("^SACHI").asPredicate());
Run Code Online (Sandbox Code Playgroud)

你也可以使用更简单的

personalNames.removeIf(s -> s.matches("^SACHI"));
Run Code Online (Sandbox Code Playgroud)

但它会Pattern.compile("^SACHI")在最糟糕的情况下为每个元素在引擎盖下执行.请注意,Pattern创建的compile是不可变的并且可以共享,因此,您也可以只创建一次,例如

static final Pattern REMOVAL_PATTERN = Pattern.compile("^SACHI");
Run Code Online (Sandbox Code Playgroud)

并使用它

personalNames.removeIf(REMOVAL_PATTERN.asPredicate());
Run Code Online (Sandbox Code Playgroud)

asPredicate()使用find()而不是matches(),但由于你的模式有^锚,它没有任何区别.在JDK 11中添加asMatchPredicate()了获取谓词的方法matches().


如果你想要的只是在开头匹配一个文字字符串,你也可以使用

personalNames.removeIf(s -> s.startsWith("SACHI"));
Run Code Online (Sandbox Code Playgroud)

它没有正则表达式初始化开销.

  • @RavindraRanwala 确实 (2认同)