Возврат карты дерева с использованием потоков в Java 11 - PullRequest
0 голосов
/ 06 ноября 2018

Я создаю функцию, которая читает файл .txt и возвращает древовидные карты в виде дерева

1 Ответ

0 голосов
/ 06 ноября 2018

Вы можете сделать это так,

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