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

Всего 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);

Выход:

abca

Примечание: filter служит той же цели, что и ваша MYCOLLECTION - я просто дал ему более осмысленное имя и использовал Set для лучшей производительности MYCOLLECTION .

Это могло бы быть чище, если бы существовал CharStream (т. CharStream Поток примитивных char ), поэтому мне не пришлось бы использовать IntStream .


«Лучше» по какой метрике? Вот как бы я это написал

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

Если вы открыты для использования сторонней библиотеки, следующее будет работать с использованием Java 8 с коллекциями Eclipse .

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 значения 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.


Есть идеи?

10000