如何使用 Lambda 表达式获取单词的平均长度
How to get words average length using Lambda Expression
我有一个单词列表文本文件,我想从该文件中获取最小、最大和平均单词长度。
我有一个流方法:
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();
}
}
在我的主要测试方法中,我打印了最大值和最小值
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<String> stringStream = reader.lines().flatMap( line ->
Stream.of(line.split("\s+"))
);
这将更正您对 max
和 min
的实施。它还会影响您希望实施的任何平均计算的正确性。
要获得平均值,您可以调用 mapToInt
to map the stream of words to their lengths (yielding an IntStream
), then call average
,其中 returns 和 OptionalDouble
。
System.out.println(readWords(filename)
.mapToInt( s -> s.length() ) // or .mapToInt(String::length)
.average()
.getAsDouble());
基于关于 reductions
的官方文档
System.out.println(readWords(filename)
.mapToInt(String::length)
.average()
.getAsDouble()
);
请注意,您可以并且可能应该使用方法引用,例如 String::length
使用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());
我有一个单词列表文本文件,我想从该文件中获取最小、最大和平均单词长度。
我有一个流方法:
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();
}
}
在我的主要测试方法中,我打印了最大值和最小值
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<String> stringStream = reader.lines().flatMap( line ->
Stream.of(line.split("\s+"))
);
这将更正您对 max
和 min
的实施。它还会影响您希望实施的任何平均计算的正确性。
要获得平均值,您可以调用 mapToInt
to map the stream of words to their lengths (yielding an IntStream
), then call average
,其中 returns 和 OptionalDouble
。
System.out.println(readWords(filename)
.mapToInt( s -> s.length() ) // or .mapToInt(String::length)
.average()
.getAsDouble());
基于关于 reductions
的官方文档System.out.println(readWords(filename)
.mapToInt(String::length)
.average()
.getAsDouble()
);
请注意,您可以并且可能应该使用方法引用,例如 String::length
使用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());