Как удалить цифры и пробелы из потока? - PullRequest
0 голосов
/ 14 мая 2019

Я пытался преобразовать аргументы в поток. И затем поток должен быть сделан заглавными, цифры и пробелы удалены из строк (не всей строки). Создание потока и прописных букв работало успешно, и теперь я застрял в методе фильтра, и я не понимаю, почему мой код не работает, я уже провел небольшое исследование.

package A_11;

import java.util.Arrays;
import java.util.stream.Stream;

public class A_11_g {
    public static void main(String[] args){
        Stream<String> stream = Arrays.stream(args);
        stream.map(s -> s.toUpperCase()).filter(s -> Character.isDigit(s)).filter(e -> !e.isEmpty())
                .forEach(name -> System.out.print(name + " "));
    }
}

Ответы [ 2 ]

1 голос
/ 14 мая 2019

filter () создает новый поток, содержащий элементы оригинала, которые удовлетворяют предикату (предоставленному вами условному условию). Вам нужна функция map (), которая создает новый поток после применения данной функции к каждому элементу исходного потока.

Ниже приведен трюк, с некоторыми утверждениями внизу, которые вы можете использовать для проверки в модульном тесте.

Stream<String> stringStream = Stream.of("unfiltered", "withDigit123", " white space ");

List<String> filtered = stringStream.map(s -> s.toUpperCase())//Can be replaced with .map(String::toUpperCase) if you want, but did it this way to make it easier to understand for someone new to all this.
        .map(s -> s.replaceAll("[0-9]", ""))//Removes all digits
        .map(s -> s.replace(" ", ""))//Removes all whitespace
        .collect(Collectors.toList());//Returns the stream as a list you can use later, technically not what you asked for so you can change or remove this depending on what you want the output to be returned as.

//Assertions, optional.
assertTrue(filtered.contains("UNFILTERED"));
assertTrue(filtered.contains("WITHDIGIT"));
assertTrue(filtered.contains("WHITESPACE"));
0 голосов
/ 14 мая 2019

Если вы действительно хотите сделать это с помощью потоков, вам нужно применить логику фильтрации на более низком уровне - не в потоке строк, а в потоке символов в одной строке:

System.out.println(
    "abcd 123 efgh".chars()
        .map(Character::toUpperCase)
        .filter(c -> !Character.isDigit(c))
        .filter(c -> !Character.isSpaceChar(c))
        .mapToObj(c -> String.valueOf((char) c))
        .collect(Collectors.joining())
);

ABCDEFGH

(Часть mapToObj предназначена для того, чтобы не иметь дело с пользовательским сборщиком, который был бы необходим в противном случае, поскольку поток является IntStream, а не обычным потоком объектов.)

Если необходимо, вы можете затем обернуть это в поток, который обрабатывает несколько строк - эта логика выше будет внутри операции map в этом потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...