我有一种方法可以从字符串中删除一些字符。有没有更好的方法来使用 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"