LambdaStreamDefault MethodOptionalCompletableFutureDate And Time
Lambda
编程规则
- 编写相似的代码,尝试抽象
- 不要重复代码(DRY
don't repeat yourself)
匿名内部类
行为参数化——策略模式
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("启动线程执行方法");
}
}).start();
// lambda表达式
new Thread(() -> System.out.println("启动线程执行方法")).start();
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
构造器引用
// 无参构造器
Supplier<String> supplier = String::new;
String test = supplier.get();
// 相当于上面的代码
Supplier<String> supplier = () -> new String();
String test = supplier.get();
// 有参构造器
Function<String, String> function = String::new;
String hello = function.apply("Hello");
// 相当于上面的代码
Function<String, String> function = (str) -> new String(str);
String hello = function2.apply("Hello");
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