6.8 Java8新增的Lambda表达式
Lambda
表达式是Java8
的重要更新,
Lambda
表达式支持将代码块作为方法参数,
Lambda
表达式允许使用更简洁的代码来创建只有一个抽象方法的接口
的实例。
6.8.1 Lambda表达式入门
Lambda表达式替代匿名内部类
接口
1 2 3 4 5
| public interface Command { void process(int[] target); }
|
匿名内部类方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class CommandTest { public static void main(String[] args) { ProcessArray pa = new ProcessArray(); int[] array = { 3, -4, 6, 4 }; pa.process(array, new Command() { public void process(int[] target) { int sum = 0; for (int tmp : target) { sum += tmp; } System.out.println("数组元素的总和是:" + sum); } }); } }
|
Lambda表达式方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class CommandTest2 { public static void main(String[] args) { ProcessArray pa = new ProcessArray(); int[] array = { 3, -4, 6, 4 }; pa.process(array, (int[] target) -> { int sum = 0; for (int tmp : target) { sum += tmp; } System.out.println("数组元素的总和是:" + sum); }); } }
|
当使用Lambda
表达式代替匿名内部类创建对象时, Lambda
表达式的代码块
将会代替实现抽象方法的方法体
, Lambda
表达式就相当一个匿名方法。
lambda表达式的组成
Lambda
表达式的主要作用就是代替匿名内部类的烦琐语法。它由三部分组成。
- 形参列表。形参列表允许省略
形参类型
。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。
- **箭头(
->
)**。必须通过英文中画线和大于符号组成
- 代码块。如果代码块只包含一条语句,
Lambda
表达式允许省略代码块的花括号,那么这条语句就不要用花括号表示语句结束。
Lambda
代码块只有一条return
语句,甚至可以省略return
关键字。
Lambda
表达式需要返回值,而它的代码块中仅有一条省略了return
的语句, Lambda
表达式会自动返回这条语句的值。
Lambda表达式简写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| interface Eatable { void taste(); }
interface Flyable { void fly(String weather); }
interface Addable { int add(int a, int b); }
public class LambdaQs { public void eat(Eatable e) { System.out.println(e); e.taste(); }
public void drive(Flyable f) { System.out.println("我正在驾驶:" + f); f.fly("【碧空如洗的晴日】"); }
public void test(Addable add) { System.out.println("5与3的和为:" + add.add(5, 3)); }
public static void main(String[] args) { LambdaQs lq = new LambdaQs(); System.out.println("------------------------------------"); lq.eat(() -> { System.out.println("苹果的味道不错!"); }); lq.eat(() -> System.out.println("苹果的味道不错!")); System.out.println("------------------------------------"); lq.drive((weather) -> { System.out.println("今天天气是:" + weather); System.out.println("直升机飞行平稳"); }); lq.drive(weather -> { System.out.println("今天天气是:" + weather); System.out.println("直升机飞行平稳"); }); System.out.println("------------------------------------"); lq.test((a, b) -> { return a + b; }); lq.test((a, b) -> a + b); } }
|
- 当
Lambda
表达式的代码块只有一行代码时
,可以省略代码块的花括号;
- 当
Lambda
表达式的形参列表只有一个形参时
,可以省略了形参列表的圆括号;
- 当
Lambda
表达式的代码块中只有一个返回语句时
,可以省略花括号和return
,直接以返回语句的表达式的计算结果作为返回值。
Lambda
表达式实际上将会被当成一个”任意类型”的对象,到底需要当成何种类型的对象,这取决于运行环境的需要。