136.JDk8增加的新特性Lambda,简化线程

希腊字母表中排序第十一位的字母,英文是Lambda,可以避免匿名内部类定义过多,其实质属于函数式编程的概念

我们对 133.实现Runnable接口实现多线程文章中实现Runnable的代码进行改造
首先我们可以给要实现多线程的类提供一个实现Runnable了接口的内部类,来实现多线程
package yzy.cn;

public class lambdaThread01{
	/*
	 *  我们可以给要实现多线程的类提供一个实现Runnable了接口的内部类,来实现多线程
	 */
	
	//静态内部类(外部类不使用,内部类就不会加载)
	static class Test implements Runnable{
		public void run() {
			for(int i=0; i<20; ++i)
				System.out.println("singing");
		}
	}
	public static void main(String[] args) {
		new Thread(new Test()).start();
	}
}

静态内部类好处就是:它的外部类不使用,内部类就不会加载1

我们继续对只使用一次的静态类进行改造,将内部类放到main里,作为方法内部类 2使用
package yzy.cn;

public class lambdaThread02 {
	public static void main(String[] args) {
		class Test implements Runnable{
			public void run() {
				for(int i=0; i<20; ++i)
					System.out.println("singing");
			}
		}
		
		new Thread(new Test()).start();
	}
}
继续改造成匿名内部类

改造成匿名内部类 3

package yzy.cn;

public class lambdaThread03 {
	public static void main(String[] args) {
		/*
		 * 在new Thread中扔进去一个new 接口加花括号引起来的类体
		 */
		new Thread(new Runnable() {
			public void run() {
				for(int i=0; i<20; ++i)
					System.out.println("singing");
			}
		}).start();
	}
}
匿名内部类只有实现Runnable接口的run方法,因此使用jdk8的lambda表达式4
package yzy.cn;

public class lambdaThread04 {
	public static void main(String[] args) {
		/*
		 * 使用jdk8的lambda表达式继续简化,只需要关注线程体的run方法就行
		 * 只需要注意参数和函数内部的具体实现就行,适用于简单的线程体
		 */
		new Thread(()-> {
				for(int i=0; i<20; ++i)
					System.out.println("singing");
		}).start();
	}
}
再写一个接口和实现类对以上改造过程进行复习
先写一个接口和实现类
package yzy.cn;

public class lambdaTest {
	public static void main(String[] args) {
		iLike like = new Like();
		like.lambda();
	}
}
interface iLike{
	void lambda();
}
class Like implements iLike{
	public void lambda() {
		System.out.println("i like lambda!");
	}
}
静态内部类
package yzy.cn;

public class lambdaTest {
	static class Like implements iLike{
		public void lambda() {
			System.out.println("i like lambda!");
		}
	}
	public static void main(String[] args) {
		iLike like = new Like();
		like.lambda();
	}
}
interface iLike{
	void lambda();
}
方法内部类
package yzy.cn;

public class lambdaTest {
	public static void main(String[] args) {
		//方法内部类
		class Like implements iLike{
			public void lambda() {
				System.out.println("i like lambda!");
			}
		}
		
		iLike like = new Like();
		like.lambda();
	}
}
interface iLike{
	void lambda();
}
匿名内部类
package yzy.cn;

public class lambdaTest {
	public static void main(String[] args) {
		//借助接口实现匿名内部类
		iLike like = new iLike() {
			public void lambda() {
				System.out.println("i like lambda!");
			}
		};
		like.lambda();
	}
}
interface iLike{
	void lambda();
}
lambda
package yzy.cn;

public class lambdaTest {
	public static void main(String[] args) {
		//lambda
		iLike like = ()-> {
				System.out.println("i like lambda!");
			};
		like.lambda();
	}
}
interface iLike{
	void lambda();
}
再写一个接口和有参数的实现类对以上改造过程进行深究
package yzy.cn;

public class lambdaTest02 {
	public static void main(String[] args) {
		iLove love = new Love();
		love.lambda(10);
	}
}
interface iLove{
	void lambda(int a);
}
class Love implements iLove{
	public void lambda(int a) {
		System.out.println("The parameter is " + a);
	}
}
用Lambda表达式改进
package yzy.cn;

public class lambdaTest02 {
	public static void main(String[] args) {
		//lambda表达式,只需要注意具体实现体
		iLove love = (int a)-> {
			System.out.println("The parameter is " + a);
		};
		love.lambda(10);
	}
}
继续改进,lambda表达式的参数类型也可以省略
package yzy.cn;

public class lambdaTest02 {
	public static void main(String[] args) {
		//lambda表达式,只需要注意具体实现体
		iLove love = (a)-> {
			System.out.println("The parameter is " + a);
		};
		love.lambda(10);
	}
}
interface iLove{
	void lambda(int a);
}
class Love implements iLove{
	public void lambda(int a) {
		System.out.println("The parameter is " + a);
	}
}
继续改进,lanbda表达式只有一个参数的时候,括号也可以省略
package yzy.cn;

public class lambdaTest02 {
	public static void main(String[] args) {
		//lambda表达式,只需要注意具体实现体
		iLove love = a-> {
			System.out.println("The parameter is " + a);
		};
		love.lambda(10);
	}
}
interface iLove{
	void lambda(int a);
}
class Love implements iLove{
	public void lambda(int a) {
		System.out.println("The parameter is " + a);
	}
}
函数题只有一行,就不需要大括号
package yzy.cn;

public class lambdaTest02 {
	public static void main(String[] args) {
		//lambda表达式,只需要注意具体实现体
		iLove love = a->System.out.println("The parameter is " + a);
		love.lambda(10);
	}
}
interface iLove{
	void lambda(int a);
}
class Love implements iLove{
	public void lambda(int a) {
		System.out.println("The parameter is " + a);
	}
}
再练习一个带有返回值的静态代理模式
package yzy.cn;

public class lambdaTest03 {
	public static void main(String[] args) {
		iInterest iIn = new Interest();
		System.out.println(iIn.lambda(10, 20));
	}
}

interface iInterest{
	int lambda(int a, int b);
}

class Interest implements iInterest{
	public int lambda(int a, int b) {
		System.out.println("The parameter is " + a + " and " + b);
		return a+b;
	}	
}
用lambda改进
package yzy.cn;

public class lambdaTest03 {
	public static void main(String[] args) {
		iInterest iIn = (int a, int b)-> {
			System.out.println("The parameter is " + a + " and " + b);
			return a+b;
		};
		System.out.println(iIn.lambda(10, 20));
		
	}
}

interface iInterest{
	int lambda(int a, int b);
}

class Interest implements iInterest{
	public int lambda(int a, int b) {
		System.out.println("The parameter is " + a + " and " + b);
		return a+b;
	}	
}
省略参数类型
package yzy.cn;

public class lambdaTest03 {
	public static void main(String[] args) {
		iInterest iIn = (a, b)-> {
			System.out.println("The parameter is " + a + " and " + b);
			return a+b;
		};
		System.out.println(iIn.lambda(10, 20));
		
	}
}

interface iInterest{
	int lambda(int a, int b);
}

class Interest implements iInterest{
	public int lambda(int a, int b) {
		System.out.println("The parameter is " + a + " and " + b);
		return a+b;
	}	
}

如果函数体只有返回值:return a+b;一句,就可以简化如下:

iInterest iIn = (a, b)->  a+b;
最终 133.实现Runnable接口实现多线程 中的coding、singing多线程就可以利用lambda简化至此:
package yzy.cn;

public class lambdaTest04 {
	public static void main(String[] args) {
		new Thread(()->System.out.println("singing")
				).start();
		
		new Thread(()->{
			for(int i=0; i<10; ++i)
				System.out.println("coding");
		}).start();
		
	}
}

  1. 编译 ↩︎

  2. 局部内部类 ↩︎

  3. 必须借助接口或者父类 ↩︎

  4. 简化简单的线程类 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值