希腊字母表中排序第十一位的字母,英文是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();
}
}