1、概念
Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等。Lambda其实就是函数式接口匿名内部类的简称。(函数式接口:有且仅有一个抽象方法的接口,就叫函数式接口)目的是帮助程序员简化代码。
2、使用语法
函数式接口 变量名 = (参数1,参数2)->{
方法体
}
语法说明:
(1)“=” 右边的参数类型会根据函数式接口的数据类型自动判断;
(2)如果形参列表为空,只需保留();
(3)如果形参只有1个,()可以省略,只需要参数的名称即可;
(4)如果执行语句只有1句,且无返回值,{}可以省略,若有返回值,则若想省去{},则必须同时省略return,且执行语句也保证只有1句;
(5)形参列表的数据类型会自动推断;
(6)lambda不会生成一个单独的内部类文件;
(7)lambda表达式若访问了局部变量,则局部变量必须是final的,若是局部变量没有加final关键字,系统会自动添加,之后再修改该局部变量,会报错。
这些只是理论说明,对还未接触过或刚接触的同学帮助不是很大。下面是一些举例说明。
3、方法引用实例说明
(这里主要对前三种方法举例)
静态方法引用 | 类名::方法名 |
实例方法引用 | 对象名::非静态方法名 |
构造方法引用 | 类名::new |
数组方法引用 | 数据类型[]::new |
特定类型的方法引用 | 类名::非静态方法 |
类中方法调用父类或本类方法引用 | this::方法名/super::方法名 |
先准备一个测试类:
因为是函数式接口,所以测试不同方法只能使用一个测试方法,这里我将所有测试方法放在了一个MyInterface接口中。新建一个LambdaTest类进行测试。
1 package cn.itsource.lambda; 2 @FunctionalInterface 3 public interface MyInterface { 4 5 /** 6 * 无参构造 7 */ 8 // void test01(); 9 10 /** 11 * 有参无返回值 12 * @param str 13 */ 14 // void test02(String str); 15 16 /** 17 * 无参有返回值 18 * @return 19 */ 20 // String test03(); 21 22 /** 23 * 有参有返回值 24 * @param d1 25 * @param d2 26 * @return 27 */ 28 // double test04(double d1,double d2); 29 30 /** 31 * 静态方法的引用 32 * @return 33 */ 34 // String test05(Integer integer); 35 36 /** 37 * 实例方法的引用 38 * @param str 39 * @return 40 */ 41 // Integer getInteger(int i); 42 43 Integer[] getStrings (int is); 44 }
(1)静态方法引用
语法 : 类名::方法名
注意事项:
被引用的方法参数列表和函数式接口中抽象方法的参数一致!!
接口的抽象方法没有返回值,引用的方法可以有返回值也可以没有
接口的抽象方法有返回值,引用的方法必须有相同类型的返回值!!
由于满足抽象参数列表与引用参数列表相同,所以可以写成静态方法引用的格式*/
MyInterface test05 = String :: valueOf;
System.out.println(test05.test05(12345));
(2)实例方法引用
package cn.itsource.lambda; @FunctionalInterface public interface Function01<T,R> { /** * 函数式接口 R、T为泛型 */ R apply(T t); }
String str = "test.txt";
Function01<String, Boolean> function01 = b -> str.endsWith(".txt");
System.out.println(function01.apply(str));
(3)构造方法引用
MyInterface test05 = Integer :: new;
System.out.println(test05.getInteger(123));
(4)数组方法引用
Function01<Integer,String[]> fun1 = String[]::new;
strs = fun1.apply(20);//20为数组长度
System.out.println(strs.length);