Java学习笔记 Lambda表达式和方法引用

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 }
View Code

(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);
    
}
View Code

  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);

猜你喜欢

转载自www.cnblogs.com/Joixiaowang/p/12791415.html