Вы можете сделать это так,
Path path = Paths.get("path/to/file", "fileName.txt");
try (Stream<String> lines = Files.lines(path)) {
Map<Integer, Long> wordLengthCount = lines.map(l -> l.split(" ")).flatMap(Arrays::stream)
.filter(s -> !s.isEmpty())
.collect(Collectors.groupingBy(w -> w.length(), TreeMap::new, Collectors.counting()));
}
Просто передайте mapFactory, поставщика, предоставляющего новую пустую карту, в которую будут вставлены результаты. Вы можете просто использовать ссылку на конструктор, как показано здесь, чтобы выполнить работу. Также обратите внимание, что это перегрузка функции groupingBy
.
Как упомянуто ниже в комментарии, это может быть дополнительно упрощено с помощью ссылки на метод вместо лямбды,
Map<Integer, Long> wordLengthCount = lines.map(l -> l.split(" ")).flatMap(Arrays::stream)
.filter(s -> !s.isEmpty())
.collect(Collectors.groupingBy(String::length, TreeMap::new, Collectors.counting()));
Возвращаясь к вашему контексту, я бы предложил вам указать путь к файлу метода, и он вернет вам Map
. Вот как это выглядит на практике.
public static Map<Integer, Long> wordCountByLength(String path) {
try (Stream<String> lines = Files.lines(Paths.get(path))) {
return lines.map(l -> l.split(" ")).flatMap(Arrays::stream).filter(s -> !s.isEmpty())
.collect(Collectors.groupingBy(String::length, TreeMap::new, Collectors.counting()));
} catch (IOException e) {
throw new RuntimeException(e);
}
}