java中Lambda表达式

Lambda表达式

可以把java中lambda表达式看做一个函数,而不是对象,lambda表达式可以也只能转换为一个函数式接口,因为java不像其他语言比如Kotlin有函数类型;借助函数式接口来传递代码,实现传递函数的的作用;kotlin中表达式

看做匿名函数;没有名称,但是有参数列表、返回类型、可能还有一个可以抛出的异常列表

作用:传递一个代码块,这个代码块可以执行一次或者多次;

特性:

  1. 匿名—:不像普通方法一样有特定方法名称
  2. 函数—:不像方法属于某个特定的类
  3. 传递—:可以作为参数传递给方法或者存储在变量中
  4. 简洁—:不需要像匿名类那样写许多模板代码

1、语法格式

(参数列表)->单表达式
或者
(参数列表)->{语句表达式}

第二种形式:必须显示使用return语句来返回值***

关于参数列表:

  1. 即使没有参数,也必须有小括号"()"
  2. 如果只有一个参数,并且参数型可以由上下文推到出来(将lambda表达式赋值给函数式接口,由其抽象方法参数列表推到出lambda表达式参数列表的参数类型),可以省略参数列表的小括号形如:event->{…}
  3. 如果可以通过上下文推导出参数列表类型,可省略参数类型;

函数式接口:仅仅定义了一个抽象方法的接口(包括从父接口继承的方法)

Lambda表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口一个具体实现的实例。

任何函数式接口都不允许抛出受检异常,如果需要Lambda表达式抛出异常,有两种办法:

  1. 自己定义一个函数式接口,并声明受检异常
  2. 把Lambda表达式包含在一个try/catch块中

2、类型检查、类型推断

Lambda表达式的类型是从使用Lambda的上下文推断出来的。上下文:接受他传递的方法的参数或者接受它值的局部变量

3、lambda表达式捕获外部局部变量、包含类实例变量

  1. Lambda表达式主体中捕获外部局部变量,该局部变量默认隐式是final;
    如:

     public void test(){
    
     	int a=10;
     	Runnable r=()->{
     			//int a=1;
     			System.out.println(a);
    
     		}
    
     	a=20;//将报错,由于a被lambda捕获,a隐式就是final类型的只能被赋值一次;
    
    
     }
    

其次,lambda主体定义的变量不能和其外部局部变量同名;

  1. Lambda中的this代表是其包含类即:创建这个lambda表达式的方法对应的this参数;
    public class Clz{
    public int a=3;

     public void test(){
     
     			
     			Runnable r=()->{
     					int a=4;
     					System.out.println(a);//4
     					System.out.println(this.a);//3
     						}
     				}
     }
    

4、Lambda显示类型转换

比如同一类中连个方法:

public void test(Runnable r);

public void test(Task task);


interface Task{

void excute();

}

这是在调用test方法时,就导致两个方法都是合法的目标方法,这是就可以使用显式的类型转换;

	test(()->{(Task)System.out.printlnn("leslie")})
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值