匿名内部类与lamda表达式
1、为什么要使用lamda表达式
从JDK1.8开始为了简化使用者进行代码开发,专门提供有Lambda表达式的支持,利用此操作形式可以实现函数式的编程,对于函数式编程比较著名的语言:haskell,Scala,利用函数式的编程可以避免掉面向对象编程之中的一些繁琐的问题。
面向对象在其长期发展的过程中一直有一部分的反对者认为面向对象过于繁琐,比如使用匿名内部类:
1 public interface IMessage { 2 public void send(String str); 3 } 4 public class Demo { 5 public static void main(String args[]){ 6 IMessage msg = new IMessage() { 7 @Override 8 public void send(String str) { 9 System.out.println("消息发送:"+str); 10 } 11 }; 12 msg.send("hahahaha"); 13 } 14 }
上面语句的核心功能只有一行核心语句,但是为了这一行核心语句依然需要按照完整的面向对象给出的设计结构进行开发。所以Lambda出现。
1 public interface IMessage { 2 public void send(String str); 3 } 4 public class Demo { 5 public static void main(String args[]){ 6 IMessage msg = (str)->{ 7 System.out.println("发送消息:"+str); 8 }; 9 msg.send("hahahaha"); 10 } 11 }
这种形式就避免了复杂的面向对象结构化的要求。
Lambda表达式如果要想使用,那么必须有一个重要的实现要求:SAM(Single Abstract Method)只有一个抽象方法(但可以有default和static方法),以IMessage接口为例,在这个接口里面发现只是提供有一个send()方法,除此之外没有任何其他方法定义,所以这样的接口就被称为函数式接口,而只有函数式接口才可以被Lambda表达式所使用
2、lamda表达式怎么用
对于Lambda表达式而言,提供了如下几种格式
1) 方法没有参数:()-->{ };
2) 方法有参数:(参数,参数)-->{ };
3) 如果现在只有一行语句返回:(参数,参数)-->语句;
我们看下第三种
1 public interface IMath { 2 public int add(int x,int y); 3 } 4 public class Demo { 5 public static void main(String args[]){ 6 IMath math = (t1,t2) -> t1 + t2; 7 System.out.println(math.add(10,20)); 8 } 9 }
利用Lambda表达式可以使代码更加简便
其中一个很经典的应用就是多线程Runnable接口的例子
1 public class Test{ 2 public static void main(String[] args) { 3 /* 4 匿名内部类的方式 5 new Thread(new Runnable() { 6 @Override 7 public void run() { 8 System.out.println("nihao"); 9 } 10 }).start(); 11 System.out.println("你好"); 12 */ 13 14 15 //lambda的方式 16 new Thread(()-> { 17 for(int i = 1 ; i<100 ; i++){ 18 System.out.println("It is a lambda function!"); 19 } 20 }).start(); 21 } 22 }
说明:lamda表达式并非只有代替匿名内部类这一个功能,还有其他的高阶功能本人未探究。
参考链接:https://blog.csdn.net/qq_36582604/article/details/81393732