目录
一、引入
需求:启动一个线程并输出一句话
@Test
public void testTradition() throws Exception {
new Thread(new Runnable(){
@Override
public void run() {
System.out.println("使用传统方式开启线程");
}
}).start();
}
本着“万物皆对象”的思想,创建一个Runnable接口的匿名内部类对象(线程对象)来指定任务内容,再启动该线程。这种做法是Ok的,但是……
我们真的想创建一个匿名内部类对象吗?
不。我们只是为了做这件事情而不得不创建一个对象。
我们真正希望做的事情是:将 run方法方法体内的代码传递给Thread类。
传递并执行这一段代码,才是我们真正的目的。
而创建对象只是受限于面向对象语法而不得不采取的一种手段方式。
那,有没有更加简单的办法?
如果我们将关注点从“怎么做”回归到“做什么”的本质上,就会发现只要能够更好地达到目的,过程与形式其实并不重要。
二、Lambda语法和使用
Lambda表达式就是对 匿名内部类对象 的一种格式的简化。
Java8中引入了一个新的操作符“->”,称为箭头运算符,或者Lambda运算符。
作用:就是用于分隔前后两部分的:
左边:表示Lambda表达式的参数列表(接口中,定义的抽象方法的参数)
右边:表示的是方法的方法体,Lambda体
1、语法格式
语法格式1:没有参数,也没有返回值
() -> System.out.println(“Hello Lambda”); |
语法格式2:有一个参数,没有返回值
(x) -> System.out.println(x * x); |
语法格式3:有多个参数,没有返回值,格式和语法格式2相同
(x, y) -> System.out.println(x + y); |
语法格式4:接口中需要重写的方法,方法内容有多句,需要给多句话加上大括号
(x, y) -> {int result = x + y; return result;} |
注意事项:如果Lambda体中语句只有一句,那么大括号可以省略不写;如果大括号中只有一条语句,并且是return语句,那么return关键字也可以省略不写(如果要省略return关键字,就必须省略大括号)
例如:(x, y) -> x + y
代码示例1
public class Demo02_Lambda表达式语法{
public static void main(String[] args) {
//test1_不使用Lambda表达式();
test2_使用Lambda表达式();
}
public static void test2_使用Lambda表达式(){
MyInter1 inter = ()->System.out.println("Lambda");
inter.test1();
}
public static void test1_不使用Lambda表达式(){
MyInter1 inter = new MyInter1(){
public void test1() {
System.out.println("no lambda");
}
};
inter.test1();
}
}
interface MyInter1{
void test1();
//void test2();
}
代码示例2
public class Demo03_Lambda表达式语法2 {
public static void main(String[] args) {
//test1_无参无返回值();
//test2_有参无返回值();
//test3_多参无返回值();
test4_有参有返回值();
}
public static void test1_无参无返回值(){
//使用匿名内部类方式
Inter1 i1 = new Inter1(){
public void sayHello() {
System.out.println("hello");
}
};
i1.sayHello();
//使用Lambda表达式
Inter1 i2 = ()->System.out.println("hello lambda");
i2.sayHello();
}
public static void test2_有参无返回值(){
// 匿名内部类方式
Inter2 i1 = new Inter2(){
public void introduce(String name) {
System.out.println("大家好,我是: "+name);
}
};
i1.introduce("渣渣辉");
//使用Lambda表达式
Inter2 i2 = (name)-> System.out.println("Lambda:大家好,我是: "+name);
i2.introduce("古天乐");
}
public static void test3_多参无返回值(){
// 匿名内部类方式
Inter3 i1 = new Inter3(){
public void test3(int x, int y) {
System.out.println(x-y);
}
};
i1.test3(100,90);
// Lambda表达式方式
Inter3 i2 = (a,b)->System.out.println(a-b);
i2.test3(200, 90);
}
public static void test4_有参有返回值(){
// 匿名内部类方式
Inter4 i1 = new Inter4() {
public int add(int a, int b) {
int result = a+b;
return result;
}
};
System.out.println(i1.add(1,2));
//Lambda表达式方式
//Inter4 i2 = (x,y)->{int result = x+y;return result;};
Inter4 i2 = (x,y)->x+y;
System.out.println(i2.add(10, 20));
}
}
interface Inter1{
void sayHello();
}
interface Inter2{
void introduce(String name);
}
interface Inter3{
void test3(int x,int y);
}
interface Inter4{
int add(int a,int b);
}