好程序员Java教程分享Java8.0新特性之Lambda表达式


java 匿名类型对象 java匿名表达式_函数式接口


Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级。本篇文章,主要给大家介绍的是lambda表达式。

Lambda表达式

Lambda表达式(也称为闭包)是Java 8中最大和最令人期待的语言改变。它允许我们将函数当成参数传递给某个方法,或者把代码本身当作数据处理:函数式开发者非常熟悉这些概念。

很多JVM平台上的语言(Groovy、Scala等)从诞生之日就支持Lambda表达式,但是Java开发者没有选择,只能使用匿名内部类代替Lambda表达式。

Lambda的设计耗费了很多时间和很大的社区力量,最终找到一种折中的实现方案,可以实现简洁而紧凑的语言结构。而lambda表达式的使用需要和函数式接口结合。

1.函数式接口

1.1.概念

函数式接口在Java中是指:有且仅有一个抽象方法的接口。 函数式接口,即适用于函数式编程场景的接口。而Java中的函数式编程体现就是Lambda,所以函数式接口就是可 以适用于Lambda使用的接口。只有确保接口中有且仅有一个抽象方法,Java中的Lambda才能顺利地进行推导。 备注:“语法糖”是指使用更加方便,但是原理不变的代码语法。例如在遍历集合时使用的for-each语法,其实 底层的实现原理仍然是迭代器,这便是“语法糖”。从应用层面来讲,Java中的Lambda可以被当做是匿名内部 类的“语法糖”,但是二者在原理上是不同的。

1.2,格式

只要确保接口中有且仅有一个抽象方法即可:

1. 修饰符 interface 接口名称 { 
2. public abstract 返回值类型 方法名称(可选参数信息); 
3. }

1.3 @FunctionalInterface注解

与 @Override 注解的作用类似,Java 8中专门为函数式接口引入了一个新的注解: @FunctionalInterface 。该注解可用于一个接口的定义上:

1. @FunctionalInterface 
2. public interface MyFunctionalInterface { 
3. void myMethod(); 
4. }

一旦使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有一个抽象方法,否则将会报错。需要注 意的是,即使不使用该注解,只要满足函数式接口的定义,这仍然是一个函数式接口,使用起来都一样.

2.函数式接口的使用

2.1函数式接口作为参数,方法不带参数

1. //定义函数式接口 
2. public interface MyInterface{ 
3. 
4. public abstract void show(); 
5. 
6. } 
7. 
8. //使用(匿名内部类对象/函数式) 
9. public class Demo01 { 
10. 
11. public static void main(String[] args) { 
12. method01(new MyInterface01() { 
13. 
14. @Override 
15. public void show() { 
16. System.out.println("你好,函数式接口"); 
17. } 
18. }); 
19. // 函数式 
20. method01(() -> { 
21. System.out.println("你好,函数式接口"); 
22. }); 
23. // 函数式简写(如果方法体中只有一句代码) 
24. method01(() -> System.out.println("你好,函数式接口")); 
25. } 
26. 
27. public static void method01(MyInterface01 inter) { 
28. inter.show(); 
29. } 
30. 
31. }

函数式接口的优势

函数式接口比匿名内部类对象产生更少的字节码对象,提升java执行效率.

2.2, 函数式接口作为参数,方法带参数

1. //定义函数式接口 
2. public interface MyInterface02 { 
3. 
4. public abstract void show(String msg1, String msg2); 
5. 
6. } 
7. 
8. //使用函数式接口 
9. public static void main(String[] args) { 
10. //匿名内部类对象 
11. method01(new MyInterface02() { 
12. 
13. @Override 
14. public void show(String msg1, String msg2) { 
15. System.out.println(msg1 + msg2); 
16. } 
17. }); 
18. //函数式完整 
19. method01((String msg1, String msg2) -> { 
20. System.out.println(msg1 + msg2); 
21. }); 
22. //函数式简写 
23. method01((msg1, msg2) -> System.out.println(msg1 + msg2)); 
24. 
25. } 
26. 
27. public static void method01(MyInterface02 inter) { 
28. inter.show("hello