lambda表达式
- 返回实现指定接口的对象实例
() - > System.out.println();
- 常见写法
Interface inter = () ->{};
Interface inter = i->{}
一个参数,括号可以省略
lambda表达式的接口只能有一个要实现的方法,即该接口为函数接口,可以使用@FunctionalInterface,来声明
- jdk8的接口新特性:接口方法可以写一个默认实现,用default关键字来声明
jdk8内置函数接口
接口 | 输入参数 | 返回类型 | 说明 | 调用方法 |
---|---|---|---|---|
Predicate | T | boolean | 断言 | test |
Consumer | T | / | 消费一个数据,有输入无输出 | accept |
Funciton<T,R> | T | R | 输入T输出R的函数 | apply |
Supplier | / | T | 提供一个数据 | get |
UnaryOperator | T | T | 一元函数,输入和输出类型一样 | |
BiFunction<T,U,R> | (T,U) | R | 2个输入函数 | apply |
BinaryOperator | (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){
// do thing
}
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)); // -> 5