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();
}

这个怎么样:

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);

输出:

abca

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

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

如果您愿意使用第三方库,则可以使用带有 Eclipse Collections 的 Java 8。

CharSet set = CharSets.immutable.with('a', 'b', 'c');
CharAdapter chars = Strings.asChars("a1b2c3");
String string = chars.select(set::contains).toString();
Assert.assertEquals("abc", string);

Eclipse Collections 支持基元集合,因此无需将char值作为Character实例进行装箱。

您还可以使用名为reject的方法排除而不是包含字符,该方法与select相反。

CharSet set = CharSets.immutable.with('a', 'b', 'c');
CharAdapter chars = Strings.asChars("a1b2c3");
String include = chars.select(set::contains).toString();
String exclude = chars.reject(set::contains).toString();
Assert.assertEquals("abc", include);
Assert.assertEquals("123", exclude);

注意:我是 Eclipse Collections 的提交者。

">

更好"以什么标准衡量?这是我的写法

final String filtered = test.chars()
.mapToObj(chr -> (char) chr)    // IntStream -> Stream<Character>
.filter(MYCOLLECTION::contains)
.collect(
Collector.of(StringBuilder::new, StringBuilder::append, StringBuilder::append, StringBuilder::toString)
);

收集器有点丑,我可能会将其提取到自己的方法

private static Collector<Character, StringBuilder, String> characterCollector()
{
return Collector.of(
StringBuilder::new,
StringBuilder::append,
StringBuilder::append,
StringBuilder::toString
);
}

然后改为调用它

.collect(characterCollector())

这是使用正则表达式的一种非常简单的方法

var string = "what ever you want!";
final var charSet = "".,;:!@";
final var stringResult = string.replaceAll("[" + charSet + "]", "");
>> ""what ever you want"

最新更新