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

lambda表达式

  • 返回实现指定接口的对象实例
    () - > System.out.println();
  • 常见写法
    Interface inter = () ->{};
    Interface inter = i->{}一个参数,括号可以省略
    lambda表达式的接口只能有一个要实现的方法,即该接口为函数接口,可以使用@FunctionalInterface,来声明
  • jdk8的接口新特性:接口方法可以写一个默认实现,用default关键字来声明

jdk8内置函数接口

接口输入参数返回类型说明调用方法
PredicateTboolean断言test
ConsumerT/消费一个数据,有输入无输出accept
Funciton<T,R>TR输入T输出R的函数apply
Supplier/T提供一个数据get
UnaryOperatorTT一元函数,输入和输出类型一样
BiFunction<T,U,R>(T,U)R2个输入函数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
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值