上一篇:看我72变-多变的内部类 | 带你学《Java面向对象编程》之八十五
【本节目标】
通过阅读本节内容,你将了解到使用Lambda表达式可以简化满足SAM要求的代码实现,并初步学会Lambda表达式的使用方法。
Lambda表达式
从JDK1.8开始为了简化使用者进行代码的开发,专门提供有Lambda表达式的支持,利用此操作形式可以实现函数式的编程。对于函数式编程比较著名的语言:haskell、Scala,利用函数式编程可以避免掉面向对象编程之中的一些繁琐的处理问题。
面向对象在其长期发展的过程之中一直有一部分的反对者,这些反对者认为面向对象的设计过于复杂,过于繁琐了。以一个最简单的程序为例。
范例:观察传统开发中的问题
interface IMessage{
public void send(String str);
}
public class JavaDemo{
public static void main(String[] args) {
IMessage msg = new IMessage(){
public void send(String str) {
System.out.println("消息发送:"+ str); //发送消息:www.mldn.cn
}
};
msg.send("www.mldn.cn");
}
}
在这样一个程序里面,实际上核心的功能只有一行语句“System.out.println("消息发送:"+ str);”,但是为了这一行的核心语句依然需要按照完整的面向对象给出的设计结构进行开发。于是这些问题随着技术的发展也是越来越突出了。
范例:使用Lambda表达式实现与之前完全一样的功能
interface IMessage{
public void send(String str) ;
}
public class JavaDemo {
public static void main(String[] args) {
IMessage msg = (str)->{
System.out.println("发送消息:"+ str) ;
};
msg.send("www.mldn.cn") ;
}
}
现在整个程序代码里面真的只是编写了一行语句,于是利用这种形式就避免了复杂的面向对象结构化的要求。
Lambda表达式如果要想使用,那么必须有一个重要的实现要求:SAM(Single Abstract Method),只有一个抽象方法,以之前的IMessage接口为例,在这个接口里面发现只是提供有一个send()方法,除此之外没有任何的其他方法定义,所以这样的接口就被称为函数式接口,而只有函数式接口才可以被Lambda表达式所使用。
范例:使用函数式接口注解
@FunctionalInterface //函数式接口
interface IMessage{
public void send(String str) ;
}
public class JavaDemo {
public static void main(String[] args) {
IMessage msg = (str)->{
System.out.println("发送消息:"+ str) ;
};
msg.send("www.mldn.cn") ;
}
}
对于Lambda表达式而言,提供有如下几种格式:
- 方法没有参数:()->{};
- 方法有参数:(参数,参数)->{};
- 如果现在只有一行语句返回:(参数,参数)->{语句};
范例:定义没有参数的方法
@FunctionalInterface //函数式接口
interface IMessage{
public void send() ;
}
public class JavaDemo{
public static void main(String[] args) {
IMessage msg = ()->{
System.out.println("发送消息:www.mldn.cn") ;
};
msg.send() ;
}
}
范例:定义有参数的处理形式
@FunctionalInterface //函数式接口
interface IMath{
public int add(int x ,int y) ;
}
public class JavaDemo{
public static void main(String[] args) {
IMath math = (t1,t2)->{
return t1 + t2 ;
};
System.out.println(math.add(10,20)) ;
}
}
以上的表达式之中你会发现只有一行语句,这个时候也可以进一步简化
范例:简化Lambda操作
@FunctionalInterface //函数式接口
interface IMath{
public int add(int x ,int y) ;
}
public class JavaDemo{
public static void main(String[] args) {
IMath math = (t1,t2)->t1 + t2 ;
System.out.println(math.add(10,20)) ;
}
}
利用Lambda表达式的确可以摆脱传统面向对象之中关于结构的限制,使得代码更加的简便。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学