前言
- 如果你在别的教材上学习lambda感觉云里雾里,我相信,我这篇文章一定能为你解开心中所有疑惑。
- 作者信息:网梦 QQ : 2756978088
lambda定义
- lambda是应用在只有一个抽象方法的接口上一种表达式,其目的是为了简化匿名内部类。(关键词:只有一个抽象方法,针对接口)
先来看匿名内部类
- 为了弄明白lambda表达式,先要明白什么是匿名内部类
- 先定义一个接口
Message
,接口内有两个抽象方法 print()
和 fun()
。
interface Message {
void print() ;
void fun() ;
}
- 按照最初的方式,我们要使用这个接口,就必须要有一个类实现了这个接口,如下:
class MessageImpl implements Message {
public void print() {
System.out.println("Hello World !") ;
}
public void fun() {
System.out.println("fun method") ;
}
}
public class Hello {
public static void main(String[] args) {
Message msg = new MessageImpl() ;
msg.print() ;
msg.fun() ;
}
}
- 好了,现在来看匿名内部类上面为了使用接口里的方法,而特意建了一个类
MessageImpl
,这个类也没有扩充新方法,所以感觉有些多余,这时候就可以用匿名内部类来解决这个多余类的问题,代码如下:
public class Hello {
public static void main(String[] args) {
// 删除 多余的MessageImpl 类,直接使用匿名内部类
Message msg = new Message() {
public void print() {
System.out.println("Hello World !") ;
}
public void fun() {
System.out.println("fun method") ;
}
} ;
msg.print() ;
msg.fun() ;
}
}
- 以上代码省略了实现接口的类,直接在实例化时加了一个代码块,代码块里面覆写了接口中所有的抽象方法(可以是一个,也可以是多个)
回到lambda,简化匿名内部类
- 内部类看起来实在是繁琐,为了使代码更elegance,lambda应运而生。lambda定义了,当接口中有且仅有一个抽象方法时,可以将匿名内部部的写法简化。
- 先假设Message接口中只有一个print抽象方法
interface Message {
void print() ;
}
public class Hello {
public static void main(String[] args) {
Message msg = new Message() {
public void print() {
System.out.println("Hello World !") ;
}
} ;
msg.print() ;
}
}
Message msg = new Message() {
public void print() {
System.out.println("Hello World !") ;
}
} ;
Message msg = () -> {System.out.println("Hello World !")} ;
Message msg = () -> System.out.println("Hello World !") ;
lambda 概念总结
- 前提条件:lambda表达式 是针对只有一个抽像方法的接口。
- 语法格式如下两种(一种有大括号{},一种没有大括号)
(参数) -> 表达式
(参数) -> {代码行;}
- 参数:因为lambda针对的接口中只有一个抽象方法,所以这里的
(参数)
就对应这个抽象方法的参数。
(参数) -> 表达式
:如果覆写方法的代码只有一行代码的话,那就可以省略掉大括号{}而直接书写单行表达式即可。
(参数) -> 表达式
:如果覆写方法的代码只有一行代码 并且 有返回值时,不仅可以省略大括号,还可以省略return关键字。
(参数) -> {代码行;}
:如果覆写方法的代码有行代码时,就不能省略大括号{}
(参数) -> {代码行;}
:如果覆写方法的代码只有一行代码 并且 有返回值 并且 还想写return关键字的话,那就不能省略大括号{}