Java 8 过滤字符串

Jav*_*mer 8 java string java-8

我有一种方法可以从字符串中删除一些字符。有没有更好的方法来使用 java 8 做到这一点?

public String filter(String test) {
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < test.length(); i++) {
        if (MYCOLLECTION.contains(test.charAt(i))) {
            builder .append(test.charAt(i));
        }
    }
    return builder .toString();
}
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 3

这个怎么样:

Set<Character> filter = new HashSet<>(Arrays.asList('a','b','c'));
String filtered = "abcdefga".chars ()
                            .filter(i -> filter.contains((char) i))
                            .mapToObj(i -> "" + (char) i)
                            .collect(Collectors.joining());
System.out.println (filtered);
Run Code Online (Sandbox Code Playgroud)

输出:

abca
Run Code Online (Sandbox Code Playgroud)

注意:filter与您的用途相同MYCOLLECTION- 我只是给了它一个更有意义的名称,并使用了Set更好的性能contains

如果有一个CharStream(即原始流char),它可能会更干净,所以我不必使用IntStream.

  • @Michael你的变体适用于ideone,因为 [`Character.toString(int)`](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ Java 11 中添加了Character.html#toString(int))。 (2认同)
  • @Naman喜欢`filtered = inputString.replaceAll(filter.stream().map(Object::toString).collect(Collectors.joining("","[^","]")),"")`?它仅在字符没有特殊含义时才有效(或者您需要额外的努力)。除非过滤器字符是恒定的,否则没有什么可以打败简单的循环解决方案...... (2认同)