主要用于简化多线程的时候线程使用次数比较少的情况
有点:
只需要关注线程体--->功能
不需要关注线程类和结构,用于简化
package iostudy.thread; /** * Lambda表达式,简化线程(用一次)的使用 * @since JDK 1.8 * @date 2021/6/2 * @author Lucifer */ public class LambdaThread { /** * 静态内部类 * 只使用一次 */ static class Test implements Runnable{ /** * 线程入口点 */ @Override public void run(){ /*循环编码*/ for (int i = 0; i < 20; i++){ System.out.println("Always Coding"); } } /* 一个类如果用一次为了提升性能可以作为内部类 不会随着程序的运行而加载,只会随着使用而进行加载 不会编译 */ } public static void main(String[] args) { /** * 局部内部类 */ class Test2 implements Runnable{ /** * 线程入口点 */ @Override public void run(){ /*循环编码*/ for (int i = 0; i < 20; i++){ System.out.println("Always Coding"); } } /* 一个类如果用一次为了提升性能可以作为内部类 不会随着程序的运行而加载,只会随着使用而进行加载 不会编译 */ } /*实例化代理类内部实例化节点类*/ new Thread(new Test2()).start(); /*匿名内部类。匿名内部类使用必须借助接口或者父类*/ new Thread(new Runnable() { /*因为接口不能实例化,所以这个花括号内部写的是具体的实现*/ /*重写run方法*/ @Override public void run(){ /*循环编码*/ for (int i = 0; i < 20; i++){ System.out.println("Always Coding"); } } }).start(); /* 匿名内部类的意思: 1、没有了实现类的对象名称 2、没有子类的名称 3、只用父类或者接口带上线程体--->因为接口不能实例化(实现体(类体)) */ /** * 因为匿名内部类里面写具体实现在流程复杂以后会写很多 * 所以使用了JDK 8当中的lambda方法 * @since JDK 1.8 */ new Thread(()->{ /*循环编码*/ for (int i = 0; i < 20; i++){ System.out.println("Always Coding"); } }).start(); /* 删掉了接口名 删掉了方法名 只需要关注参数和实现。 适用于较简单的线程体--->用于简化简单的线程类 */ /* lambda特点: 接口里面只能由一个方法,有多个方法无法推到 */ } /* 好处: 1、如果内部类不使用,那么该类不会编译 */ /* 1、最初的外部类 2、静态内部类 3、局部内部类 4、匿名内部类 5、lambda内部类 */ }
package iostudy.thread; /** * lambda表达式的推到 * @since JDK 1.8 * @date 2021/6/2 * @author Lucifer */ public class LambdaTestNo1 { /*定义成内部类*/ /*定义实现类,实现lambda*/ static class Like2 implements like{ /*重写接口方法*/ @Override public void lambda(){ System.out.println("I like lambda!!!"); } } public static void main(String[] args) { /*实例化实现类对象*/ Like like = new Like(); like = new Like( ); /*调用实现类的lambda方法*/ like.lambda(); /*第三种调用方法*/ like = new Like(){ public void lambda(){ System.out.println("I like lambda3!!!"); } }; //lambda表达式 like like1 = ()->{ System.out.println("I like lambda3!!!"); }; } } /*定义内部接口*/ interface like{ /*定义接口内部方法*/ void lambda(); } /*定义实现类,实现lambda*/ class Like implements like{ /*重写接口方法*/ @Override public void lambda(){ System.out.println("I like lambda!!!"); } }
特点:
lambda推到必须存在类型--->因为接口当中定义了泛型
package iostudy.thread; /** * Lambda推到+参数 * @since JDK 1.8 * @date 2021/6/3 * @author Lucifer */ public class LambdaTestNo2 { public static void main(String[] args) { /*使用lambda表达式去简化输出*/ ILove love = (int a) -> { System.out.println("Lambda is:" + a); }; /*如果只有一个参数,括号可以省略。如果多个参数,数据类型可以省略--->因为接口当中的形参定义了类型*/ ILove love1 = (a) -> { System.out.println("Lambda is:" + a); }; /*只有一个参数,省略括号*/ ILove love2 = a -> { System.out.println("Lambda is:" + a); }; /*如果重写内容只有一行代码,花括号可以省略*/ ILove love3 = a -> System.out.println("Lambda is:" + a); /*调用一下*/ love.lambda(100); love1.lambda(50); love2.lambda(5); love3.lambda(0); } } /** * 定义一个接口 */ interface ILove{ /*里面放一个方法*/ void lambda(int a); //方法定义形参 } /** * 定义一个外部类,实现接口,重写方法 */ class Love implements ILove{ /*重写接口方法*/ @Override public void lambda(int a){ System.out.println("Lambda is:" + a); } }
package iostudy.thread; /** * Lambda推到+参数+返回值 * @since JDK 1.8 * @date 2021/6/3 * @author Lucifer */ public class LambdaTestNo3 { public static void main(String[] args) { /*lambda表达式使用*/ IInterest interest = (int first, int second) -> { System.out.println("lambda is:" + (first + second)); int total = (first + second); return total; }; IInterest interest1 = (first, second) -> { System.out.println("lambda is:" + (first + second)); int total = (first + second); return total; }; /*如果只有一行返回值,可以直接简化成结果*/ IInterest interest2 = (first, second) -> { return first + second; }; /*启动*/ interest.lambda(100, 200); interest1.lambda(200, 300); interest2.lambda(300, 400); } } /** * 定义一个有返回值的接口 */ interface IInterest{ /*定义有返回值的方法*/ public abstract int lambda(int a, int b); } /** * 定义一个外部类,该外部类实现接口并且重写方法 */ class Interest implements IInterest{ /*重写接口当中的方法*/ public int lambda(int first, int second){ System.out.println("lambda is:" + (first + second)); int total = (first + second); return total; } }
避免匿名内部类使用过多
其实质是函数式编程
(params) -> expression (params) -> statement (params) -> (statements) //简单的多线程或者匿名内部类的地方使用lambda表达式