Как перейти с Streamдля потоковой передачи <Strings>Java 8 - PullRequest
0 голосов
/ 01 ноября 2019

Я не могу преобразовать поток массивов (строк) в поток строк.

public static List<String> getFirstNames(List<String> names){
        return names.stream()
                .map(x->x.split("\\s[A-Za-z]+"))
                .map(elem-> new String())
                .collect(Collectors.toList());
}

У меня есть список строк на входе, включая имя и фамилию. На выходе должен быть Список Имен.

Ответы [ 4 ]

2 голосов
/ 01 ноября 2019

Если ваш список содержит такие элементы, как "FirstName LastName" Вы можете использовать метод substring() для извлечения первых имен s.substring(0, s.indexOf(" ")

Попробуйте это:

public static List<String> getFirstNames(List<String> names){
    return names.stream().map(s -> s.substring(0, s.indexOf(" "))).collect(Collectors.toList());
}

Если ваш список содержитэлементы одного слова:

public static List<String> getFirstNames(List<String> names){
    return names.stream().map(s -> s.indexOf(" ")>0 ? s.substring(0, s.indexOf(" ")) : s).collect(Collectors.toList());
}
2 голосов
/ 01 ноября 2019

Используйте .map(x->x.split("\\s[A-Za-z]+")[0]) и оставьте второй ненужный map. Вы хотите первый элемент массива, и это строка. Нет смысла передавать полный массив в секунду map().

Но если вы действительно хотите, тогда вторая карта должна быть .map(arr -> arr[0]). Вам не нужен новый String, он уже существует.

Кроме того, поскольку это базовый синтаксис (ну, не потоки, а доступ к массивам и использование строк), обновите здесь или вы будете продолжать спотыкаться о простых ошибках.

Разделение на пробел (split(" ")) более читабельно, если только у вас нет причин использовать более громоздкую версию?

0 голосов
/ 01 ноября 2019
public static List<String> getFirstNames(List<String> names){
    return names.stream()
            .map(x->Arrays.asList(x.split("\\s[A-Za-z]+")))
            .flatMap(Collection::stream)
            .collect(Collectors.toList());
}

flatMap делает работу

Оптимальное решение:

public static List<String> getFirstNames(List<String> names){
    return names.stream()
            .map(x->x.split("\\s+")[0])
            .collect(Collectors.toList());
}
0 голосов
/ 01 ноября 2019

Вот пример использования Arrays :: stream с flatmap

List<String> firstNames =
            Arrays.asList("Aman Singh","Raj Malhotra").stream()
                    .map(word -> word.split("\\s[A-Za-z]+"))
                    .flatMap(Arrays::stream)
                    .collect(toList());

    System.out.println("First names are" + firstNames);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...