Lambda表达式想必大家都不陌生,jdk8的新特性,Lambda表达式需要函数式接口的支持,所谓函数式接口就是只有一个方法的接口,可以通过注解@FunctionalInterface来检查该接口是否是函数式接口,如下图左就是函数式接口,而右则不是。
下面来一个我们比较常见的例子,线程的例子,我们创建一个线程,一般会去重写Runnable接口,原始的方法就是用匿名内部类,现在有了Lambda表达式,就显得更加简便
首先以创建一个线程为例子
package com.zhiying;
public class MyTest {
public static void main(String[] args) {
//传统的方法
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("hello world");
}
}).start();
// 用Lambda表达式一
new Thread(() -> System.out.println("hello")).start();
// 用Lambda表达式二
new Thread(() -> {
System.out.println("hello");
}).start();
}
}
下面进行Lambda的详细介绍
格式一:无参数,无返回值
package com.zhiying;
@FunctionalInterface
public interface Hello {
public void add();
}
package com.zhiying;
public class MyTest {
public static void main(String[] args) {
Hello hello1 = () -> {
System.out.println("hello world");
};
hello1.add();
// 只有一句的时候可以省略{}
Hello hello2 = () -> System.out.println("hello world");
hello2.add();
}
}
格式二:有一参数,无返回值
package com.zhiying;
@FunctionalInterface
public interface Hello {
public void add(int a);
}
package com.zhiying;
public class MyTest {
public static void main(String[] args) {
// 只有一个参数的时候,()可以省
Hello hello1 = (a) -> System.out.println(a);
hello1.add(2);
Hello hello2 = a -> System.out.println(a);
hello2.add(3);
}
}
格式三:有多参数,无返回值
package com.zhiying;
@FunctionalInterface
public interface Hello {
public void add(int a,int b);
}
package com.zhiying;
public class MyTest {
public static void main(String[] args) {
Hello hello = (a,b) -> System.out.println(a + b);
hello.add(1,2);
}
}
格式四:有返回值
package com.zhiying;
@FunctionalInterface
public interface Hello {
public int add(int a,int b);
}
package com.zhiying;
public class MyTest {
public static void main(String[] args) {
Hello hello1 = (a,b) -> {
System.out.println("hello world");
return a + b;
};
System.out.println(hello1.add(1,2));
// 如果只有一条返回语句,return和{}可以都省略
Hello hello2 = (a,b) -> a + b;
System.out.println(hello1.add(2,2));
}
}