jdk1.8新特性——方法引用构造器引用及数组引用详解
Posted 小志的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jdk1.8新特性——方法引用构造器引用及数组引用详解相关的知识,希望对你有一定的参考价值。
目录
一、方法引用
1、方法引用的理解
- 如果 Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用。可以将方法引用理解为 Lambda 表达式的另外一种表现形式。
2、方法引用的基本语法
- 对象的引用 :: 实例方法名
- 类名 :: 静态方法名
- 类名 :: 实例方法名
3、方法引用的注意事项
- 方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致。
- 如果Lambda 的参数列表的第一个参数,是实例方法的调用者,且Lambda 的参数列表的第二个参数(或无参)是实例方法的参数时,使用ClassName::MethodName格式。
二、方法引用的示例
1、方法引用语法 (对象的引用 :: 实例方法名)
-
示例代码如下:
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<String> con =(x)-> System.out.println(x); con.accept("Lambda表达式写法!"); //优化方式一 对象的引用::实例方法名 的格式 System.out.println("-------------方法引用写法如下--------------"); PrintStream printStream=System.out; Consumer<String> con1 =printStream::println; con1.accept("方法引用写法(对象的引用::实例方法名)的语法格式"); //优化方式二 对象的引用::实例方法名 的格式 System.out.println("++++++++++++++++方法引用写法如下++++++++++++"); Consumer<String> con2 =System.out::println; con2.accept("方法引用写法(对象的引用::实例方法名)的语法格式"); } }
-
输出结果如下:
-
方法引用的注意事项:方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致。
2、方法引用语法 (类名 :: 静态方法名)
-
示例代码如下:
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<Integer> comparable=(x, y)->Integer.compare(x,y); int result=comparable.compare(20,8); System.out.println(result); //优化方式 类名::静态方法名 的格式 System.out.println("-------------方法引用写法如下--------------"); Comparator<Integer> comparable1=Integer::compare; int result1=comparable.compare(20,8); System.out.println(result1); } }
-
输出结果如下:
-
方法引用的注意事项:方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致。
3、方法引用语法 (类名 :: 实例方法名)
-
示例代码如下:
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<String, String> biPredicate=(x,y)->x.equals(y); boolean flag=biPredicate.test("xz","xz"); System.out.println(flag); //优化方式 类名 :: 实例方法名 的格式 System.out.println("-------------方法引用写法如下--------------"); BiPredicate<String, String> biPredicate1=String::equals; boolean flag1=biPredicate.test("xz","xz"); System.out.println(flag); } }
-
输出结果如下:
-
方法引用的注意事项1:方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致。
-
方法引用的注意事项2:如果Lambda 的参数列表的第一个参数,是实例方法的调用者,且Lambda 的参数列表的第二个参数(或无参)是实例方法的参数时,使用ClassName::MethodName格式。
三、构造器引用
1、构造器引用的理解
- 与函数式接口相结合,自动与函数式接口中方法兼容。可以把构造器引用赋值给定义的方法。
2、构造器引用的基本语法(类名 :: new)
- 类名 :: new
3、构造器引用的注意事项
- 构造器的参数列表,需要与函数式接口中参数列表保持一致。
四、构造器引用的示例
-
示例代码如下:
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<Integer,Employee> fun=(x)->new Employee(x); Employee emp=fun.apply(20); System.out.println(emp); System.out.println("-------------构造器引用写法如下(构造器传1个参数)--------------"); Function<Integer,Employee> fun1=Employee::new; Employee emp1=fun1.apply(20); System.out.println(emp1); System.out.println("=========Lambda表达式写法如下(构造器传2个参数)============="); BiFunction<Integer,String, Employee> biFunction=(x,y)->new Employee(x,y); Employee emp2=biFunction.apply(1,"张三"); System.out.println(emp2); System.out.println("-------------构造器引用写法如下(构造器传2个参数)--------------"); BiFunction<Integer,String, Employee> biFunction1 = Employee::new; Employee emp3 = biFunction1.apply(1, "张三"); System.out.println(emp3); } }
-
输出结果如下:
-
构造器引用的注意事项:构造器的参数列表,需要与函数式接口中参数列表保持一致。
五、数组引用
1、数组引用的基本语法(类型[] :: new)
- 类型[] :: new
2、数组引用的示例
-
示例代码如下:
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<Integer, String[]> fun = (x) -> new String[x]; String[] str = fun.apply(5); System.out.println(str.length); System.out.println("-------------构造器引用写法如下--------------"); Function<Integer, String[]> fun1 = String[]:: new; String[] str1 = fun.apply(10); System.out.println(str1.length); } }
-
输出结果如下:
以上是关于jdk1.8新特性——方法引用构造器引用及数组引用详解的主要内容,如果未能解决你的问题,请参考以下文章