java表达式之Lambda表达式(一)

最近在我的项目中看见代码中有“→”当时我也是一脸懵的样子,于是我去百度一波,原来这个“→”是Lambda表达式。那么什么是Lambda表达式呢?

一、什么是Lambda表达式:
Lambda表达式是一个匿名函数,在java8之前如果想将一个行为传入函数中Java 8之前,如果想将行为传入函数中,仅有的选择就是匿名类,需要6行代码。而定义行为最重要的那行代码,却混在中间不够突出。Lambda表达式取代了匿名类,取消了模板,允许用函数式风格编写代码。这样有时可读性更好,表达更清晰。让我们来举个简单的栗子。
求两个数的和,我们用正常的方法写如下:

public int plus(int a , int b){
return a+b ;
}
转换为Lambda表达式为:
(int a , int b)→a+b;
参数类型也可以省略,java编译器会根据上下文推断出来:
(a , b)→a+b ;
也可以写成这种形式:
(a , b)→{return a+b ;}
由上面的栗子可以看出来Lambda表达式有三部分组成:
参数列表、箭头(→)、语句块或表达式。
在Lambda表达式中,输入参数是箭头的左边部分。它包含参数的数量可以为0、1或者多个。
当输入参数的个数为0时,小括号不用写任何参数(但是小括号不能省略)。
当输入参数的个数为1时,箭头左边的一对小括号才可以省略(注意,只有在这种情况下小括号才可以省略,其他的情况都不可以)。
当输入参数的数量大于或者等于2时,小括号不可以省略,参数之间要用”,”(逗号)分隔开。
对于上述的三种情况分别举个栗子:
1)下面的这个Lambda表达式中没有返回值,没有参数,实际上就是Runnable里run方法的一个实现。
() → { System.out.println(“Hello everybody!”); }
2) 当输入参数的个数为1个时,可以写成下面这种形式:
a → (return a.size();)
java可以根据a.size();推断出a的类型。所以此时可以省略小括号和参数的数据类型。

二、Lambda表达式的类型
Lambda表达式类型叫做”目标类型”,Lambda的目标类型是”函数接口”,它的定义是一个接口,如果只有一个显式声明的抽象方法,那么它就是一个函数接口。一般用@FunctionalInterface标注出来(也可以不标)。举个栗子

@FunctionalInterface
public interface Runnable(){
void run();
}

public interface Comparator { int compare(T o1, T o2); boolean equals(Object obj); }

注意:第Comparator这个接口中,它里面声明了两个方法,看起来不符合函数接口的定义,但是它就是函数接口,这是因为equals方法是Object的,所有的接口都会声明public方法,虽然大多数都是隐式的,所以Comparator虽然显示声明了equals方法,但是并不影响Comparator是函数接口这个事实。

我们可以用一个Lambda表达式为一个函数接口赋值。
Runnable r1 = ()→{System.out.println(“hello everybody”);}
然后再把它赋值给一个Object
Object obj = r1;
但是你不可以像下边这样写:
Object obj = () -> {System.out.println(“hello everybody”);};
如果这样写会报下面的错误:
ERROR! Object is not a functional interface!
必须显式的转型成一个函数接口才可以:
Object o = (Runnable) () -> { System.out.println(“hello everybody”); };
所以一个Lambda表达式只有在被转换为函数接口后才可以被当做Object使用。

下面我们自己写一个和Runnable接口长得很像的接口
@FunctionalInterface
public interface MyRunnable {
public void run();
}
下面我们用Lambda表达式为函数接口赋值:
Runnable r1 = () -> {System.out.println(“Hello everybody!”);};
MyRunnable2 r2 = () -> {System.out.println(“Hello everybody!”);};
以上两种都是正确的写法,这说明一个Lambda表达式可以有多个目标类型(函数接口),只要函数匹配成功就可以。
但是需要注意的是一个Lambda表达式必须至少有一个目标类型。

以上是Lambda表达式最最基础的部分,如有不对的地方欢迎指正(关于Lambda表达式更多的知识请期待下回分解)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值