如何使用Lambda Expression获得单词平均长度

时间:2015-09-11 23:33:17

标签: java lambda java-8 java-stream

我有一个单词列表文本文件,我想从该文件中获取最小,最大和平均单词长度。

我有一个流方法:

public static Stream<String> readWords(String filename) {
    try {
        BufferedReader reader = new BufferedReader(new FileReader(filename));
        Stream<String> stringStream = reader.lines();
        return stringStream;
    } catch (IOException exn) {
        return Stream.<String>empty();
    }
}

在我测试的主要方法中,我打印max和min

System.out.println(readWords(filename)
        .min(Comparator.comparing(s -> s.length()))
        .get()
        .length()
);
System.out.println(readWords(filename)
        .max(Comparator.comparing(s -> s.length()))
        .get()
        .length()
);

它按预期工作。

问题:
是否有可能像我在min和max中那样得到单词长度的平均值?在是或否的情况下,如何做到(仅作为Lambda表达式)?

3 个答案:

答案 0 :(得分:13)

OnApplyComplete方法会为您提供一行而不是单词。获得lines()后,调用flatMap将单词替换为单词,提供lambda表达式以拆分单词:

Stream

这将更正Stream<String> stringStream = reader.lines().flatMap( line -> Stream.of(line.split("\\s+")) ); max的实施。它还会影响您希望实施的任何平均计算的正确性。

要获得平均值,您可以调用mapToInt将单词流映射到他们的长度(产生min),然后调用average,返回IntStream }。

OptionalDouble

答案 1 :(得分:7)

使用IntSummaryStatistics一次性获得最小值,最大值和平均值。

IntSummaryStatistics summary = readWords(filename)
    .collect(Collectors.summarizingInt(String::length));
System.out.format("min = %d, max = %d, average = %.2f%n",
    summary.getMin(), summary.getMax(), summary.getAverage());

答案 2 :(得分:6)

基于有关reductions

的官方文档
String::length

请注意,您可以并且可能应该使用test.xml

等方法引用