Как конвертировать StreamПоток <String>? - PullRequest
0 голосов
/ 16 декабря 2018

Я пытаюсь сгладить мой поток String [] в поток String

Например

{ "A", "B", "C" }, {"D, "E" } to "A", "B", "C", "D", "E"

Это код, который у меня есть:

Files.lines(Paths.get(file)).map(a -> a.split(" "));

Files.lines(path) возвращает Stream[String], и я разбил каждую строку на "", чтобы получить массив всех слов (так что теперь Stream<String[]>.

Я хотел бы объединить каждый массив слов в отдельные элементы, поэтомуStream[String] вместо Stream<String[]>

Когда я использую flatMap вместо карты, я получаю сообщение об ошибке: Type mismatch: cannot convert from String[] to Stream<? extends Object>

Я думал, что flatMap используется для этой цели? Какой лучший способ?чтобы выполнить то, что я пытаюсь сделать


Вопрос от профессора:

Использование потоков: напишите метод для классификации слов в файле по длине:

public static Map<Integer,List<String>> wordsByLength(String file) 
throws IOException {
   // COMPLETE THIS METHOD
}

Ответы [ 3 ]

0 голосов
/ 16 декабря 2018
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);

A Stream#flatMap картограф ожидает возврата Stream.Вы возвращаете String[].Чтобы превратить String[] в Stream<String>, используйте Arrays.stream(a.split(" ")).

Полный ответ на ваше задание:

public static Map<Integer, List<String>> wordsByLength(String file)
        throws IOException {
    return Files.lines(Paths.get(file))
                .flatMap(a -> Arrays.stream(a.split("\\s+")))
                .collect(Collectors.groupingBy(String::length));
}
0 голосов
/ 16 декабря 2018

Вам нужна операция .flatMap():

  • после обычной операции .map()

    Files.lines(Paths.get(file)).map(a -> a.split(" ")).flatMap(Arrays::stream);
    
  • в сочетании с обычной map операция:

    Files.lines(Paths.get(file)).flatMap(a -> Arrays.stream(a.split(" ")));
    

В конце вам понадобится

public static Map<Integer, List<String>> wordsByLength(String file) throws IOException {
    return Files.lines(Paths.get(file))                      //Stream<String>
            .map(a -> a.split(" "))                          //Stream<String[]>
            .flatMap(Arrays::stream)                         //Stream<String>
            .collect(Collectors.groupingBy(String::length)); //Map<Integer, List<String>>
}
0 голосов
/ 16 декабря 2018

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

Например,

.flatMap(a -> Arrays.stream(a.split(" ")))
...