JDK8的新特性->Lambda表达式,也可称之为闭包。使用Lambda表达式可以让代码变得更加简洁紧凑。
Lambda表达式对接口的要求:Lambda表达式规定接口中只能有一个需要实现的方法,而不是接口中只能有一个方法。(jdk 8 中有另一个新特性:default, 被 default 修饰的方法会有默认实现,不是必须被实现的方法,所以不影响 Lambda 表达式的使用。)
通过例子来看一下,代码逐渐简洁的一个过程,更好的理解Lambda表达式:
1.外部类
package javase;
public class TestLambda {
public static void main(String[] args) {
InLambda inLambda = new InLambdaImpl();
inLambda.testLam();
}
}
// 函数式接口
interface InLambda{
// 无参函数
void testLam();
}
// 外部类
class InLambdaImpl implements InLambda{
@Override
public void testLam() {
System.out.println("我是外部类");
}
}
运行结果:
2.静态内部类
package javase;
public class TestLambda {
// 静态内部类
static class InLambdaImpl implements InLambda{
@Override
public void testLam() {
System.out.println("我是静态内部类");
}
}
public static void main(String[] args) {
InLambda inLambda = new InLambdaImpl();
inLambda.testLam();
}
}
// 函数式接口
interface InLambda{
// 无参函数
void testLam();
}
运行结果:
3.局部内部类
package javase;
public class TestLambda {
public static void main(String[] args) {
//局部内部类
class InLambdaImpl implements InLambda{
@Override
public void testLam() {
System.out.println("我是局部内部类");
}
}
InLambda inLambda = new InLambdaImpl();
inLambda.testLam();
}
}
// 函数式接口
interface InLambda{
// 无参函数
void testLam();
}
运行结果:
4.匿名内部类
package javase;
public class TestLambda {
public static void main(String[] args) {
InLambda inLambda = new InLambda() {
@Override
public void testLam() {
System.out.println("我是匿名内部类");
}
};
inLambda.testLam();
}
}
// 函数式接口
interface InLambda{
// 无参函数
void testLam();
}
运行结果:
现在我们来用Lambda表达式来代替函数式接口:
package javase;
public class TestLambda {
public static void main(String[] args) {
InLambda inLambda = () -> {
System.out.println("我是Lambda");
};
inLambda.testLam();
}
}
// 函数式接口
interface InLambda{
// 无参函数
void testLam();
}
运行结果:
可以发现Lambda 表达式大大的减少了我们的代码量,而且他还可以更加精简。
package javase;
public class TestLambda {
public static void main(String[] args) {
// 无参函数
InLambda inLambda = () -> {
System.out.println("我是Lambda");
};
inLambda.testLam();
// 对于只有一句函数体的,可以省略花括号
InLambda inLambda2 = () -> System.out.println("我是Lambda2");
inLambda2.testLam();
// 有参函数
InLambda2 in2 = (int a) -> System.out.println("Lambda一个有参函数"+ a);
in2.testLam(5);
// 可以省略参数类型
in2 = (a) -> System.out.println("Lambda一个参数函数:省略参数类型" +a);
in2.testLam(4);
// 省略小括号
in2 = a -> System.out.println("Lambda一个有参函数:省略小括号:"+ a);
in2.testLam(6);
}
}
// 函数式接口
interface InLambda{
// 无参函数
void testLam();
}
interface InLambda2{
// 有参函数
void testLam(int a);
}