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

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

我有一个流方法:

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

在我的主要测试方法中,我打印最大和最小

 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表达式)?

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

 Stream stringStream = reader.lines().flatMap( line -> Stream.of(line.split("\\s+")) ); 

这将纠正你的maxmin 。 它还会影响您希望实施的任何平均计算的正确性。

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

 System.out.println(readWords(filename) .mapToInt( s -> s.length() ) // or .mapToInt(String::length) .average() .getAsDouble()); 

使用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()); 

根据有关减少的官方文件

 System.out.println(readWords(filename) .mapToInt(String::length) .average() .getAsDouble() ); 

请注意,您可以并且可能应该使用String::length类的方法引用