函数式编程/lambda表达式
lambda表达式jdk8内置函数接口方法引用静态方法引用非静态方法,使用对象实例的方法引用构造函数方法引用无参含参
类型推断变量引用级联表达式和柯里化
lambda表达式
返回实现指定接口的对象实例 () - > System.out.println();常见写法 Interface inter = () ->{}; Interface inter = i->{}一个参数,括号可以省略 lambda表达式的接口只能有一个要实现的方法,即该接口为函数接口,可以使用@FunctionalInterface,来声明jdk8的接口新特性:接口方法可以写一个默认实现,用default关键字来声明
jdk8内置函数接口
接口输入参数返回类型说明调用方法
PredicateTboolean断言testConsumerT/消费一个数据,有输入无输出acceptFunciton<T,R>TR输入T输出R的函数applySupplier/T提供一个数据getUnaryOperatorTT一元函数,输入和输出类型一样BiFunction<T,U,R>(T,U)R2个输入函数applyBinaryOperator(T,T)T二元函数(输出输入类型相同)
方法引用
:: 函数执行体里只有一个函数调用,并且函数的参数和箭头左边一样,就可以缩写为方法引用的方式 s-> System.out.println(s)->System.out::println;
静态方法引用
Consumer
<Object> consumer
= Object
::staticMethod
非静态方法,使用对象实例的方法引用
Consumer<Object> consumer = object::method
jdk会默认把当前实例传入非静态方法,参数名为this,位置在第一个,所以在引用非静态方法的时候需要用两个输入参数的函数接口BiFunction构造函数的方法引用
BiFunction
<Object,InputType,ReturnType> functionName
= Object
::method
ReturnType
return = functionName
.apply(object
,param
);
构造函数方法引用
无参
构造函数无返回值,所以使用Supplier接口
Supplier
<Object> supplier
=Object
::new
含参
Function
<RequestType,Object> function
=Object
::new
Object object
= function
.apply(requestType
);
类型推断
interface IMath{
public int add(int a
,int b
);
}
public class Demo{
public static void main(String
[] args
){
IMath iMath1
= (x
,y
)-> x
+y
;
IMath
[] iMath2
= {(x
,y
)-> x
+y
};
Object iMath3
= (IMath
)(x
,y
)-> x
+y
;
IMath iMath4
=createIMath();
Demo demo
= new Demo();
demo
.action((x
,y
)-> x
+y
);
}
public void action(IMath iMath
){
}
public static IMath(){
return (x
,y
)-> x
+y
;
}
}
变量引用
由于lambda表达式本质是匿名内部类,所以在引用外部的属性时,要求外部属性必须为final,本质原因是java的传值引用
级联表达式和柯里化
级联表达式:多个箭头的lambda表达式 柯里化:把多个参数的函数转化为只有一个参数的函数。目的:函数标准化 有点类似Jquery?
Function
<Integer
,Function
<Integer,Integer>> fun
= x
->y
->x
+y
System
.out
.println(fun
.apply(2).apply(3));