🌈个人主页: Aileen_0v0
🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法
💫个人格言:“没有罗马,那就自己创造罗马~”
Lambda函数式编程含义
-
这个函数类似于数学中的函数(强调做什么),只要输入的数据一致返回的结果也是一致的
- 函数式编程:将函数整体作为对象来使用。
数学中的函数示例: 2x +1 | |||||||||
Java中的函数(Lambda表达式): (x)-> 2x +1 | |||||||||
函数式编程的使用条件及优点
- 使用函数式编程代替某些匿名内部类对象,可以简化程序,加强代码可读性。
-
上图中,左边的代码块是通过匿名内部类的写法,右边代码块是通过函数式编程实现的简化。
- 左图中的操作:
- 1.创建新的类,实现Runnable,但是类的名字是匿名的。
- 2.创建了这个新类的实例 (一次性)。
- 3.重写
run
方法。
- 右图中的操作:
- 1.将左边匿名内部类里面的重写run方法的参数列表提出来,然后指向 -> {被重写的run方法的方法体代码}。
- 实际上就是只保留方法体内的参数列表及内部执行逻辑。
- 1.将左边匿名内部类里面的重写run方法的参数列表提出来,然后指向 -> {被重写的run方法的方法体代码}。
- 左图中的操作:
-
Lambda只能替代接口的匿名内部类,并且这个接口只有一个抽象方法。
函数式编程案例
普通实现方式
- 假设现在要实现不同方式来发送相同的信息,我们可以先写一个信息的接口。
Message 接口
package thread.FunProexample;
public interface Message {
void send();
}
Email 类
package thread.FunProexample;
public class Email implements Message{
String emailaddress;
//构造方法
public Email(){
}
public void send(){
System.out.println("这是·邮件。");
}
}
Sms 类
package thread.FunProexample;
public class Sms implements Message{
String phoneNumber;
//构造方法
public Sms(){
}
public void send(){
System.out.println("这是·Sms。");
}
}
main方法
package thread.FunProexample;
public class Main {
public static void main(String[] args) {
Message email = new Email();//实例化一个Email对象,(向上转型)因为Email类实现了Message接口,所以变量email的类型应该为Message
//将上面的变量传入到sendMessage方法
sendMessage(email);
System.out.println("===============");
//发送Sms消息
Message sms = new Sms();
sendMessage(sms);
}
public static void sendMessage(Message message){
//因为参数类型为message接口,所以无论传入的是Email还是Sms对象,它们都各自实现了Message接口的send方法
//所以sendMessage只需要执行message的send方法,而不需要关心是哪个对象的send方法 -> 面向接口编程
message.send();
}
}
- 在上面的类中我们实现了通过不同方式进行信息发送的效果
- 但是我们每次实现不同的发送方式都需要创建一个新的类,这就会使得我们的文件变多,为了减少负荷,我们可以通过函数式编程来进行解耦合,上面我们谈过函数式编程是匿名内部类实现的简化,下面我们将会把这两种实现方式进行对比和总结。
匿名内部类和函数式编程的实现方式
main方法
package thread.Test2;
import thread.FunProexample.Email;
import thread.FunProexample.Sms;
public class Main {
public static void main(String[] args) {
// public void send(){
// System.out.println("这是·邮件。");
// }
//匿名内部类的实现方式
sendMessage(new Message() {
@Override
public Boolean send(String name1, String title) {
System.out.println("这是·Sms to " + title + " " + name1);
return true;
}
});
//函数式编程的实现方式
sendMessage((name1,title) ->{
System.out.println("这是·Sms to " + title + " " + name1);
return true;
});
}
public static void sendMessage(Message message){
//因为参数类型为message接口,所以无论传入的是Email还是Sms对象,它们都各自实现了Message接口的send方法
//所以sendMessage只需要执行message的send方法,而不需要关心是哪个对象的send方法 -> 面向接口编程
Boolean status = message.send("Aileen","Sigma");
System.out.println(status);
}
}
接口
package thread.Test2;
@FunctionalInterface
public interface Message {
Boolean send(String name,String title);
// Boolean send2(String name,String title);
}
总结:
- lambda(函数式编程)以及匿名内部类的好处就是可以不用去创建多个类来实现这些方法,但是lambda相比于匿名内部类来说更加简化,无需重写抽象方法,只关注方法里面的实现过程。