29 匿名内部类、函数型接口、lamda表达式的引入
匿名内部类
参考:https://www.runoob.com/w3cnote/java-inner-class-intro.html
进入后搜索匿名内部类。
函数型接口
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
例如,我们常用的Runnable接口,翻看源码发现,它只有一个抽象方法run,它就是一个函数型接口。
@FunctionalInterface public interface Runnable { public abstract void run(); }
参考:https://www.runoob.com/java/java8-functional-interfaces.html
匿名内部类与函数型接口简化一个线程案例:
简化前:
package _20191203; /** * 创建线程的方法一:继承Thread * @author UID * */ public class ThreadTest{ public static void main(String[] args) { new Thread(new ThreadRun()).start();//主要看这里 for(int i = 0;i < 200;i++) { System.out.println("一边听歌"); } } } class ThreadRun implements Runnable{ @Override public void run() { //必需重写run方法 for(int i = 0;i < 200;i++) { System.out.println("一边敲代码"); } } }
简化后:
package _20191203; /** * 创建线程的方法一:继承Thread * @author UID * */ public class ThreadTest{ public static void main(String[] args) { new Thread(new Runnable(){ //主要看这里 @Override public void run() { for(int i = 0;i < 200;i++) { System.out.println("一边敲代码"); } } }).start(); for(int i = 0;i < 200;i++) { System.out.println("一边听歌"); } } }
引入lamda表达式
emm...不好讲啊。
上面的代码还可以使用lamda表达式进一步简化。
lamada时jdk 8 的新特性,它不是java独创的,实际上它来源自scale社区,并且被越来越多的程序中使用,它可以大大简化代码。
参考:https://baike.baidu.com/item/Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F/4585794?fr=aladdin
lamda表达式的使用方法参考:https://www.cnblogs.com/coprince/p/8692972.html
可以使用lamda表达式的接口就是函数型接口,在上面的案例中,Runnable接口就是一个函数型接口,所以这里我们可以使用lamda表示式对上面的例子进行简化:
public class ThreadTest{ public static void main(String[] args) { //new Thread(new ThreadRun()).start(); new Thread(()->{ //主要看这里 lamda表达式 for(int i = 0;i < 200;i++) { System.out.println("一边敲代码"); } }).start(); for(int i = 0;i < 200;i++) { System.out.println("一边听歌"); } } }
当抽象方法有参数时,对应写成的(参数)->{代码}
而且不必写参数类型