参考并建议阅读《Java8函数式编程》
/《java 8 实战》
----------------------------------------------------------------------------------------------------------------------------------
基本类型
java中有一些相伴的类型,如int和Integer-----前者是基本类型,后者是装箱类型。将基本类型转换为装箱类型,称为装箱,反之则称为拆箱,两者都需要额外的计算开销。为了减小这些性能开销,Stream类对基本类型和装箱类型做了区分。对基本类型做特殊处理的方法在命名上有明确规范:
1)如果返回类型为基本类型, 则在基本类型名称前面加To
![](https://i-blog.csdnimg.cn/blog_migrate/9195527feca7a069375ea456805a86e8.png)
2)如果参数类型是基本类型, 则不加前缀只需类型名即可
![](https://i-blog.csdnimg.cn/blog_migrate/a884f35b279b25a55b212032d93e661b.png)
3)如果高阶函数使用基本类型, 则在操作名后加To, 再加基本类型名, 如mapToLong
重载解析
在java中可以重载方法,造成多个方法有相同的方法名,但签名却不一样。这在推断参数类型时会带来问题,因为系统可能会推断出多种类型。这时,javac会挑出最具体的类型。
Lambda表达式作为参数时,其类型由它的目标类型推导得出,推导过程遵循如下规则:
1)如果只有一个可能的目标类型,由相应的函数接口里的参数类型推导得出;
2)如果有多个可能的目标类型,由最具体的类型推导得出;
3)如果有多个可能的目标类型且最具体的类型不明确,则需人为指定类型。
默认方法
老的接口中增加了新的方法,如果像兼容老的接口而不去改已经生成的其他子类,提供了一个新的方法叫默认方法,在任何接口中,无论函数接口还是非函数接口,都可以使用该方法。代码示例如下:
default void forEach(Consumer<? super T> action) {
for (T t : this) {
action.accept(t);
}
}
重点在于代码段前新关键字default,它告诉javac用户真正需要的是为接口添加一个新的方法。注意,和类不同,接口没有成员变量,默认方法只能调用子类的方法来修改子类本身,避免了对子类的实现做出各种假设。
注意:类中重写的方法胜出,与接口中定义的默认方法相比,类中重写的方法更具体。
三定律:如果默认方法在多重继承的行为下可以遵守如下三个定律,
1)类胜于接口。
2)子类胜于父类。
3)如果上面两条规则不适用,子类要么需要实现该方法,要么将该方法声明为抽象方法。
接口的静态方法和默认方法的用法:
1)静态方法只能使用接口调用, 这是将共用工具放在接口中更加方便
2)默认方法只能使用实现类调用, 这是因为兼容。
Optional
Optional是为核心类库新设计的一个数据类型, 用于替换null值.
1)有一个empty工厂方法用于创建空对象
2)ofNullable可将一个Null转换成Optional对象
3)
调用get方法获得泛型类型的对象.
4)isPresent方法判断是否为空
5)orElse orElseGet orElseThrow方法可以自由定制为空时的返回值/抛出异常