Java8InAction学习笔记(六) - 18965050/Java8InAction GitHub Wiki
Default Method
Java8中接口也可以有实现方法. 这有两种方式, 一种为静态方法, 另一种为default方法.
这种情况下抽象类和接口的区别在于:
- 实现类只能继承一个抽象类, 但可以实现多个接口
- 抽象类可以有实例变量, 接口不可以
接口默认方法的出现,会引起方法钻石调用的问题. 因此需要确认规则:
- class always win: 在类中实现的方法优先级高于接口默认方法
- other, sub-interfaces win: 如果都是接口默认方法, 则子类重载的默认方法优先级高
- other,如果是diamond模型(比如A有默认方法;B,C继承A,但都没有重载默认方法, D实现B,C接口.),此时对默认方法的调用即为A的默认方法. 不需要明确指定对哪个接口的默认方法调用(这点和C++中diamond模型调用不同)
- finally, 如果不满足上述1,2两点, 则需要明确说明使用的是哪个接口的默认方法. 格式为:
InterfaceName.super.defaultMethod()
Optional
为了避免无聊的NullPointException代码检查, Java8引入了Optional对象.
创建
- Optional.empty(): 创建空的Optional对象
- Optional.of(T t): 通过非空已有值创建. 如果已有为null, 则立刻抛出NullPointerException异常
- Optional.ofNullable(T t): 通过已有值创建. 如果已有值为null, 则创建一empty Optinal对象
使用
Optional.map()和Optional.flatMap()的区别
Optional.filter()

Primitive Optional
类似于Stream有Primitive Stream: IntStream, LongStream和DoubleStream一样. Optional也有Primitive Optional: OptionalInt,OptionalLong,OptionalDouble. 但一般不推荐使用,因为这些类没有filter(),flatMap,map()等方法
CompletableFuture
Java5提供了Future接口, 用于异步获取执行结果. 但还存有使用限制, 比如: 异步结果依赖等等. Java8提供了CompletableFuture类, 类似于Stream相对于Collection. 以流式声明的方式和lambda表达式来扩展Future的功能.
时间
LocalDate: 只表示到年,月, 日 LocalTime: 表示时,分,秒 LocalDateTime: 结合LocalDate和LocalTime Instant: 给机器使用.
TemporalField ChronoField