使用 summaryStatistics 方法统计曲目长度
public static void printTrackLengthStatistics(Album album) {
IntSummaryStatistics trackLengthStats = album.getTracks()
.mapToInt(track -> track.getLength())
.summaryStatistics();
System.out.println(trackLengthStats.toString());
}
结果:
mapToInt 方法返回一个IntStream 对象,它包含一个summaryStatistics 方法,这个方法能计算出各种各样的统计值,如IntStream 对象内所有元素的最小值,最大值,平均值 以及数值总和。
4.3 重载解析
有两个重载方法可供选择:
private interface IntegerBiFunction extends BinaryOperator<Integer> {
}
// BinaryOperator 是一种特殊的BiFunction 类型,参数的类型和返回值类型相同。
private void overloadedMethod(BinaryOperator<Integer> lambda){
System.out.println("BinaryOprator");
}
private void overloadedMethod(IntegerBiFunction lambda){
System.out.println("IntegerBiFunction");
}
重载方法调用:
overloadedMethod((x,y) -> x+y);
Java 编译器推导出的lambda 表达式的类型是最具体的函数接口类型。因此此时输出的是:IntegerBiFunction 。
如果存在多个可能目标类型且最具体的类型不明确,则需要人为指定类型,否则会导致编译错误。
4.4 @FunctionInterface
该注释会强制javac 检查一个接口是否符合函数接口的标准。
4.10 Optional
Optional 是为核心类库新设计的一个数据类型,用来替换null值。Optional 对象相当于值得容器,使用工厂方法of 可以从某个 值创建Optional 对象,使用get 方法可以提取该值。
Optional <String> a = Optional.of("a");
assertEquals("a",a.get());
Optional emptyOptional = Optional.empty();
Optional alsoEmpty = Optional.ofNullable(null);
orElse(String other) 方法给空的Optional 对象提供一个备选值。
如果计算备选值太过繁琐,可以使用orElseGet(Supplier<T> supplier) 方法,只用在Optional对象真正为空时才会调用。
assertEquals("b",emptyOptional.orElse("b"));
assertEquals("c" ,emptyOptional.orElseGet(() -> "c"));