Java 8
- Lambda
- Stream
- Default Method
- Optional
- CompletableFuture
- Date And Time
Lambda
编程规则
- 编写相似的代码,尝试抽象
- 不要重复代码(DRY
don't repeat yourself)
匿名内部类
行为参数化——策略模式
| 1 |  | 
Lambda
@FunctionalInterface
规定接口只有一个抽象方法,接口中有default方法实现以及Object里面的方法不参与抽象方法的统计
函数接口
- Predicate- 有参数T,有返回值boolean, - boolean test(T t)- 支持原生类型,避免自动拆装箱 - IntPredicate参数为int,- boolean test(int value)
- LongPredicate参数为long,- boolean test(long value)
- DoubleFunction参数为double,- boolean test(double value)
 - BiPredicate- 有参数T和U,有返回值boolean, - boolean test(T t, U u)
 
- Consumer- 有参数T,无返回值, - void accept(T t)- 支持原生类型,避免自动拆装箱 - IntConsumer参数为int,- void accept(int value)
- LongConsumer参数为long,- void accept(long value)
- DoubleConsumer参数为double,- void accept(double value)
 - BiConsumer- 有参数T和U,无返回值, - void accept(T t, U u)- 支持原生类型,避免自动拆装箱 - ObjIntConsumer有参数T和int,无返回值,- void accept(T t, int value)
- ObjLongConsumer有参数T和long,无返回值,`void accept(T t, long value)
- ObjDoubleConsumer有参数T和double,无返回值,`void accept(T t, double value)
 
 
- Supplier- 无参数,有返回值T, - T get()- 支持原生类型,避免自动拆装箱 - BooleanSupplier无参数,有返回值boolean,- boolean getAsBoolean()
- IntSupplier无参数,有返回值int,- int getAsInt()
- LongSupplier无参数,有返回值long,- long getAsLong()
- DoubleSupplier无参数,有返回值double,- double getAsDouble()
 
- Function- 有参数T,有返回值R, - R apply(T t)- 支持原生类型,避免自动拆装箱 - IntFunction有参数int,有返回值R,- R apply(int value);
- IntToLongFunction有参数int,有返回值long,- long applyAsLong(int value)
- IntToDoubleFunction有参数int,有返回值double,- double applyAsDouble(int value);
- LongFunction有参数long,有返回值R,- R apply(long value)
- LongToDoubleFunction有参数long,有返回值double,- double applyAsDouble(long value)
- LongToIntFunction有参数long,有返回值int,- int applyAsInt(long value)
- DoubleFunction有参数double,有返回值R,- R apply(double value)
- DoubleToLongFunction有参数double,有返回值long,`long applyAsLong(double value)
- DoubleToIntFunction有参数double,有返回值int,`int applyAsInt(double value)
- ToIntFunction有参数T,有返回值int,- int applyAsInt(T value)
- ToLongFunction有参数T,有返回值long,- long applyAsLong(T value)
- ToDoubleFunction有参数T,有返回值double,- double applyAsDouble(T value)
 - UnaryOperator
 - 有参数T,有返回值T, - T apply(T t)- 支持原生类型,避免自动拆装箱 - IntUnaryOperator有参数int,有返回值int,- int applyAsInt(int t)
- LongUnaryOperator有参数long,有返回值long,- long applyAsLong(long t)
- DoubleUnaryOperator有参数double,有返回值double,- double applyAsInt(double t)
 - BiFunction- 有参数T和U,有返回值R, - R apply(T t, U u)- 支持原生类型,避免自动拆装箱 - ToIntBiFunction有参数T和U,有返回值int,`int applyAsInt(T t, U u)
- ToLongBiFunction有参数T和U,有返回值int,`long applyAsLong(T t, U u)
- ToDoubleBiFunction有参数T和U,有返回值double,`int applyAsDouble(T t, U u)
 - BinaryOperator- 有参数T和T,有返回值T,`T apply(T t, T u) - 支持原生类型,避免自动拆装箱 - IntBinaryOperator有参数int和int,有返回值int,- int applyAsInt(int left, int right)
- LongBinaryOperator有参数long和long,有返回值long,- long applyAslong(long left, long right)
- DoubleBinaryOperator有参数double和double,有返回值double,- double applyAsDouble(double left, double right)
 
 
 
链式调用
- Predicate- negate取反
- and并且
- Or或者
 
- Function- compose先调用- compose里面方法,后调用方法
- andThen接着调用方法
 - f.compose(g(x))相当于f(g(x)),而f.andThen(g(x))相当于g(f(x)) 
总结
四种基础函数接口,PSCF,分别为Predicate、Supplier、Consumer、Function,其分别代表test判断、get获取,accept接收消费,apply应用创建,支持原生类型有int、long、double,命名规则为对应原生类型的封装类加上对应的函数接口名称,若方法有返回值,方法签名规则为对应方法名加上As*,其中Predicate还有个原生类型boolean,Function接口有原生类型int、long、double相互之间的转换。有参数的函数接口(除Supplier外)都有扩展两个参数的函数接口,命名规则为为Bi*。BiConsumer有扩展第二个参数为原生类型int、long、double,命名规则为Obj*Consumer,BiFunction支持原生类型int、long、double返回值,命令规则为To*BiFunction。Function还有两个特需的函数接口,分别为UnaryOperator和BinaryOperator,分别表示T创建T,T,T创建T,同一种类型的参数同一种的返回值,他们支持原生类型int、long、double,命名规则为其原生类型的封装类加上的对应的函数接口名称,返回值的方法名是加上As*
备注:命名规则中的*代表原生类型的封装类
方法引用
- 类的静态方法 - args -> ClassName.staticMethod(args) ClassName::staticMethod 
- 参数的实例方法 - arg0,rest ->arg0.instanceMethod(rest) ClassName::instanceMethod 
- 外部变量的实例方法 - args -> expr.instanceMethod(args) expr::instanceMethod 
构造器引用
| 1 |  | 
Stream
A stream is a sequence of elements from a source that supports data processing operations.
Stream是提供数据处理操作源的元素序列
获取Stream方法
- Stream.of()
- Arrays.stream()
- Collection.stream()
- Stream.iterate()
- Stream.generate()
操作符
中间操作符
- 过滤和截断- filter 过滤条件
- distinct 去重
- limit 限制长度(短路操作符)
- skip 跳过长度
 
- 转换- map 转换为另一个Stream
- flatMap 多重Stream转换为单独Stream
 
- sorted
结束操作符
- forEach 
- collect 
- 查询和匹配 - allMatch 是否所有匹配(短路操作符)
- anyMatch 是否匹配任何一个(短路操作符)
- noneMatch 是否所有不匹配(短路操作符)
- findFirst 返回匹配的第一个元素
- findAny 返回匹配的任一元素
 - 在不关心返回哪个元素的前提下,并发的时候优先使用findAny进行匹配 
- 归纳 - reduce- 第一个参数是初始值,无初始值的时候返回Optional
- 第二个参数是计算值BinaryOperator(T,T ->T)
 
- count 统计元素个数
 
- reduce
原生类型Stream
- IntStreamint类型的Stream
- LongStreamlong 类型的Stream
- DoubleStreamdouble类型Stream
Default Method
接口可以有默认实现,用default进行申明方法,接口中也可以使用静态方法。
- 何时使用- 可选方法
- 多层继承行为
 
- 同一个方法签名多层使用规则- 优先类中方法
- 再次子类接口方法
- 最后使用申明的方法,一般是指父接口的默认方法
 
Optional
为了解决null问题,引进了Optional,这个一定程度了上是参考了Guava的实现。主要方法如下
| empty | 返回一个空的 Optional实例 | 
|---|---|
| filter | 不为空并且匹配,返回当前 Optional,否则返回空的Optional | 
| flatMap | 不为空,转换为方法转换的 Optional,否则返回空的Optional | 
| get | 不为空返回值,否则抛出 NoSuchElementException | 
| ifPresent | 不为空执行值消费,否则不处理 | 
| isPresent | 不为空返回 true,否则false | 
| map | 不为空应用提供的方法 | 
| of | 值为空抛出 NullPointerException,否则返回Optional的实例 | 
| ofNullable | 返回 Optional的实例,值为空时返回空的Optional | 
| orElse | 不为空返回值,否则返回参数默认值 | 
| orElseGet | 不为空返回值,否则返回参数方法创建值 | 
| orElseThrow | 不为空返回值,否则抛出方法创建的异常 |