1、简单介绍
当我们创建一个内部类的适合,要写类名,函数名,类型等很多东西,比如
public class demo1 {
public static void main(String[] args) {
//普通地创建内部类,很麻烦
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("普通的匿名内部类创建");
}
}).start();
}
}
真正有用的就只是输出一句话而已,居然要做这么多麻烦的工作,所以Java8开始,就为我们弄了个Lambda的东西让我们简化代码
package restudy;
public class demo1 {
public static void main(String[] args) {
// Lambda方式创建了内部类
new Thread(() -> {
System.out.println("Lambda方式的匿名内部类创建");
}).start();
}
}
这个,不需要写new 类名,不需要写函数,里面就只有() -> { 输出语句 }
就完事了,多么简单
2、语法分析
仔细分析该代码中的语义, Runnable 接口只有一个 run 方法的定义:public abstract void run();
3部分组成
- 一些参数
- 一个箭头
- 一段代码
具体语法:
() ‐> {
System.out.println("多线程任务执行!");
}
3、无参数无返回例子
我们就先定义一个接口(Myinterface
),里面写一个抽象类的函数(void printTest();
),这样我们就一定要在用的时候重写函数了。然后在主程序创建一个静态函数(LambdaTest(Myinterface myinterface)
),参数为接口(Myinterface
),LambdaTest()
里面调用接口函数myinterface.printTest();
。最后再在主程序中调用LambdaTest()
,由于里面有参数Myinterface
,所以要新建对象,这个新建对象就可以用Lambda来使用了
package restudy;
public interface Myinterface {
void printTest();
}
package restudy;
public class demo1 {
public static void main(String[] args) {
//普通地调用内部类
LambdaTest(new Myinterface() {
@Override
public void printTest() {
// TODO 自动生成的方法存根
System.out.println("创建成功");
}
});
//用Lambda调用内部类
LambdaTest(() -> {
System.out.println("创建成功");
});
}
private static void LambdaTest(Myinterface myinterface) {
myinterface.printTest();
}
}
创建成功
Lambda创建成功
4、用参数和返回值的例子
package restudy;
public interface Myinterface {
int printTest(int a,int b);
}
package restudy;
public class demo1 {
public static void main(String[] args) {
//调用LambdaTest方法,第三个参数是new一个interface接口的
LambdaTest(10, 20, (int a, int b) -> {
return a + b;
});
}
//静态方法,第三个参数调用Myinterface
private static void LambdaTest(int a, int b, Myinterface myinterface) {
int result = myinterface.printTest(a, b);
System.out.println("两个相加得到" + result);
}
}
两个相加得到30
5、Lambda省略格式
- 小括号内参数的类型可以省略;
- 如果小括号内有且仅有一个参,则小括号可以省略;
- 如果大括号内有且仅有一个语句,则无论是否有返回值,都可以省略大括号、return关键字及语句分号。
- 使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法。
package restudy;
public interface Myinterface {
int printTest(int a);
}
package restudy;
public class demo1 {
public static void main(String[] args) {
// 调用LambdaTest方法,
LambdaTest(10, (int a) -> {
return a;
});
}
// 静态方法,第三个参数调用Myinterface
private static void LambdaTest(int a, Myinterface myinterface) {
int result = myinterface.printTest(a);
System.out.println("这个值为" + result);
}
}
简写:
package restudy;
public class demo1 {
public static void main(String[] args) {
// 调用LambdaTest方法,
LambdaTest(10,
(a)-> a
);
}
}