如何使用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+")) );
这将纠正你的max
和min
。 它还会影响您希望实施的任何平均计算的正确性。
要获得平均值,可以调用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
类的方法引用