Lamda表达式
-
Lambda表达式,可以称为闭包,它是推动Java8发动的最重要新特性
-
Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)
-
为什么要使用Lambda表达式
- 可以避免匿名内部类定义过多
- 可以让你的代码看起来更加简洁
- 去掉了一堆没有意义的代码,只留下核心的逻辑
-
基本语法
(parameters)->expression[表达式]; (parameters)->statement[语句]; (parameters)->{statement};
-
函数式接口(Functional Interface)是学习Lambda表达式的关键所在。其定义为:
-
任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口。
public interface Runnable{ public abstract void run(); }
-
对于函数式接口,我们可以通过lambda表达式来创建该接口的对象。
-
-
Lambda表达式的推导演示
现在,我们有一个函数式接口LambdaInterface,它只有一个抽象方法我们该怎样实现他的方法并执行呢?
-
接口LambdaInterface
//创建函数式接口 interface LambdaInterface { void lambda(); }
-
创建实现类去实现接口,再创建实现类的对象,调用该方法
//1.创建实现类实现接口 class LambdaImp implements LambdaInterface { @Override public void lambda() { System.out.println("I am Lambda1"); } }
main函数中调用
public static void main(String[] args) { LambdaInterface lambdaImp = new LambdaImp(); lambdaImp.lambda(); }
-
上述需要在外部写一个实现类,比较繁琐,我们简化一下用一个静态内部类实现。
在TestLambda类中
//2.静态内部类实现 static class LambdaImp2 implements LambdaInterface { @Override public void lambda() { System.out.println("I am Lambda2"); } }
main函数中
LambdaImp2 lambdaImp2 = new LambdaImp2(); lambdaImp2.lambda();
-
因为静态内部类的实现不能直接在main函数中写,我们可以继续简化,在main函数中写一个局部内部类实现接口
//3.局部内部类实现 class LambdaImp3 implements LambdaInterface { @Override public void lambda() { System.out.println("I am Lambda3"); } } LambdaImp3 lambdaImp3 = new LambdaImp3(); lambdaImp3.lambda();
-
因为是使用局部内部类实现需要写方法名和继承的接口,所以我们继续简化,使用匿名内部类来实现接口
//4.匿名内部类实现 lambdaImp = new LambdaInterface() { @Override public void lambda() { System.out.println("I am Lambda4"); } }; lambdaImp.lambda();
-
倘若我们要继续简化下去,把一些接口、类和方法的声明都省略掉,仅保留核心代码。此时可以使用Lambda表达式来进行简化!
//6.Lambda表达式简化实现 lambdaImp = ()->{ System.out.println("I am Lambda5"); }; lambdaImp.lambda();
运行结果:
我们可以发现,步骤1到步骤5都能实现需求。而每一个步骤都可以做出一定的简化,从步骤1的外部类实现到使用Lambda表达式保留核心代码,使我们的代码更为的简洁了,这便是Lambda表达式的推导过程。
-
-
Lambda的简化
创建接口LambdaInterface02
//1.创建函数式接口 interface LambdaInterface02 { void lambda(int a); }
创建测试类TestLambda02
package com.lambda; public class TestLambda02 { public static void main(String[] args) { LambdaInterface02 lambdaInterface = null; //Lambda表达式 LambdaInterface02 lambda1 = (int a) -> { System.out.println("I am Lambda"+a); }; lambda1.lambda(1); //简化1:去掉括号与类型 LambdaInterface02 lambda2 = a -> { System.out.println("I am Lambda"+a); }; lambda1.lambda(2); //简化2:去掉花括号 LambdaInterface02 lambda3 = (int a) -> System.out.println("I am Lambda"+a); lambda1.lambda(3); } }
-
总结
-
Lambda表达式只能有一行代码的情况下才能简化成为一行(去掉花括号),如果有多行代码,就需要用代码块包裹(花括号)
-
使用Lambda表达式的前提是接口为函数式接口
-
多个参数也可以去掉参数类型,但是需要把全部参数类型都去掉且必须加上小括号
LambdaInterface02 lambda2 = (a,b) -> { System.out.println("I am Lambda"+a+b); };
-