jdk8新特性:函数式编程lambda表达式

mac2025-01-21  41

函数式编程/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){ // 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
最新回复(0)