Java 8
LambdaStreamDefault MethodOptionalCompletableFutureDate 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)
链式调用
Predicatenegate取反and并且Or或者
Functioncompose先调用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类型的StreamLongStreamlong 类型的StreamDoubleStreamdouble类型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 |
不为空返回值,否则抛出方法创建的异常 |