目录
一、方法引用
1、方法引用的理解
- 一、方法引用
- 1、方法引用的理解
- 2、方法引用的基本语法
- 3、方法引用的注意事项
- 二、方法引用的示例
- 1、方法引用语法 (对象的引用 :: 实例方法名)
- 2、方法引用语法 (类名 :: 静态方法名)
- 3、方法引用语法 (类名 :: 实例方法名)
- 三、构造器引用
- 1、构造器引用的理解
- 2、构造器引用的基本语法(类名 :: new)
- 3、构造器引用的注意事项
- 四、构造器引用的示例
- 五、数组引用
- 1、数组引用的基本语法(类型[] :: new)
- 2、数组引用的示例
- 如果 Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用。可以将方法引用理解为 Lambda 表达式的另外一种表现形式。
- 对象的引用 :: 实例方法名
- 类名 :: 静态方法名
- 类名 :: 实例方法名
- 方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致。
- 如果Lambda 的参数列表的第一个参数,是实例方法的调用者,且Lambda 的参数列表的第二个参数(或无参)是实例方法的参数时,使用ClassName::MethodName格式。
-
示例代码如下:
package com.xz.springboot_java8.day5; import java.io.PrintStream; import java.util.function.Consumer; /** * @description: 方法引用语法 (对象的引用 :: 实例方法名) * @author: xz */ public class Test1 { public static void main(String[] args) { System.out.println("=========Lambda表达式写法如下============="); Consumer con =(x)-> System.out.println(x); con.accept("Lambda表达式写法!"); //优化方式一 对象的引用::实例方法名 的格式 System.out.println("-------------方法引用写法如下--------------"); PrintStream printStream=System.out; Consumer con1 =printStream::println; con1.accept("方法引用写法(对象的引用::实例方法名)的语法格式"); //优化方式二 对象的引用::实例方法名 的格式 System.out.println("++++++++++++++++方法引用写法如下++++++++++++"); Consumer con2 =System.out::println; con2.accept("方法引用写法(对象的引用::实例方法名)的语法格式"); } }
-
输出结果如下:
-
方法引用的注意事项:方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致。
-
示例代码如下:
package com.xz.springboot_java8.day5; import java.util.Comparator; /** * @description: 方法引用语法 (类名 :: 静态方法名) * @author: xz */ public class Test2 { public static void main(String[] args) { System.out.println("=========Lambda表达式写法如下============="); Comparator comparable=(x, y)->Integer.compare(x,y); int result=comparable.compare(20,8); System.out.println(result); //优化方式 类名::静态方法名 的格式 System.out.println("-------------方法引用写法如下--------------"); Comparator comparable1=Integer::compare; int result1=comparable.compare(20,8); System.out.println(result1); } }
-
输出结果如下:
-
方法引用的注意事项:方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致。
-
示例代码如下:
package com.xz.springboot_java8.day5; import java.util.function.BiPredicate; /** * @description: 方法引用语法 (类名 :: 实例方法名) * 若Lambda 的参数列表的第一个参数,是实例方法的调用者, * 且Lambda 的参数列表的第二个参数(或无参)是实例方法的参数时, * 格式: ClassName::MethodName * @author: xz */ public class Test3 { public static void main(String[] args) { System.out.println("=========Lambda表达式写法如下============="); BiPredicate biPredicate=(x,y)->x.equals(y); boolean flag=biPredicate.test("xz","xz"); System.out.println(flag); //优化方式 类名 :: 实例方法名 的格式 System.out.println("-------------方法引用写法如下--------------"); BiPredicate biPredicate1=String::equals; boolean flag1=biPredicate.test("xz","xz"); System.out.println(flag); } }
-
输出结果如下:
-
方法引用的注意事项1:方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致。
-
方法引用的注意事项2:如果Lambda 的参数列表的第一个参数,是实例方法的调用者,且Lambda 的参数列表的第二个参数(或无参)是实例方法的参数时,使用ClassName::MethodName格式。
- 与函数式接口相结合,自动与函数式接口中方法兼容。可以把构造器引用赋值给定义的方法。
- 类名 :: new
- 构造器的参数列表,需要与函数式接口中参数列表保持一致。
-
示例代码如下:
package com.xz.springboot_java8.day5; import com.xz.springboot_java8.day5.entity.Employee; import java.util.function.BiFunction; import java.util.function.Function; /** * @description: 构造器引用 (类名 :: new) * @author: xz */ public class Test4 { public static void main(String[] args) { System.out.println("=========Lambda表达式写法如下(构造器传1个参数)============="); Function fun=(x)->new Employee(x); Employee emp=fun.apply(20); System.out.println(emp); System.out.println("-------------构造器引用写法如下(构造器传1个参数)--------------"); Function fun1=Employee::new; Employee emp1=fun1.apply(20); System.out.println(emp1); System.out.println("=========Lambda表达式写法如下(构造器传2个参数)============="); BiFunction biFunction=(x,y)->new Employee(x,y); Employee emp2=biFunction.apply(1,"张三"); System.out.println(emp2); System.out.println("-------------构造器引用写法如下(构造器传2个参数)--------------"); BiFunction biFunction1 = Employee::new; Employee emp3 = biFunction1.apply(1, "张三"); System.out.println(emp3); } }
-
输出结果如下:
-
构造器引用的注意事项:构造器的参数列表,需要与函数式接口中参数列表保持一致。
- 类型[] :: new
-
示例代码如下:
package com.xz.springboot_java8.day5; import java.util.function.Function; /** * @description: 数组引用 (类型[] :: new) * @author: xz */ public class Test5 { public static void main(String[] args) { System.out.println("=========Lambda表达式写法如下============="); Function fun = (x) -> new String[x]; String[] str = fun.apply(5); System.out.println(str.length); System.out.println("-------------构造器引用写法如下--------------"); Function fun1 = String[]:: new; String[] str1 = fun.apply(10); System.out.println(str1.length); } }
-
输出结果如下: