JDK8新特性之方法引用

网友投稿 702 2022-09-06

JDK8新特性之方法引用

JDK8新特性之方法引用

JDK8新特性之方法引用

文章目录

​​JDK8新特性之方法引用​​​​方法引用​​

​​1. 为什么要用方法引用​​

​​1.1 lambda表达式冗余​​​​1.2 解决方案​​

​​2. 方法引用的格式​​

​​2.1 对象名::方法名​​​​2.2 类名::静态方法名​​​​2.3 类名::引用实例方法​​​​2.4 类名::构造器​​​​2.5 数组::构造器​​

最近刚好有空给大家整理下JDK8的特性,这个在实际开发中的作用也是越来越重了,本文重点讲解下方法引用。

方法引用

1. 为什么要用方法引用

1.1 lambda表达式冗余

在使用Lambda表达式的时候,也会出现代码冗余的情况,比如:用Lambda表达式求一个数组的和

package com.bobo.jdk.funref;import java.util.function.Consumer;public class FunctionRefTest01 { public static void main(String[] args) { printMax(a->{ // Lambda表达式中的代码和 getTotal中的代码冗余了 int sum = 0; for (int i : a) { sum += i; } System.out.println("数组之和:" + sum); }); } /** * 求数组中的所有元素的和 * @param a */ public void getTotal(int a[]){ int sum = 0; for (int i : a) { sum += i; } System.out.println("数组之和:" + sum); } private static void printMax(Consumer consumer){ int[] a= {10,20,30,40,50,60}; consumer.accept(a); }}

1.2 解决方案

因为在Lambda表达式中要执行的代码和我们另一个方法中的代码是一样的,这时就没有必要重写一份逻辑了,这时我们就可以“引用”重复代码

package com.bobo.jdk.funref;import java.util.function.Consumer;public class FunctionRefTest02 { public static void main(String[] args) { // :: 方法引用 也是JDK8中的新的语法 printMax(FunctionRefTest02::getTotal); } /** * 求数组中的所有元素的和 * @param a */ public static void getTotal(int a[]){ int sum = 0; for (int i : a) { sum += i; } System.out.println("数组之和:" + sum); } private static void printMax(Consumer consumer){ int[] a= {10,20,30,40,50,60}; consumer.accept(a); }}

:: 方法引用 也是JDK8中的新的语法

2. 方法引用的格式

符号表示:​​::​​

符号说明:双冒号为方法引用运算符,而它所在的表达式被称为​​方法引用​​

应用场景:如果Lambda表达式所要实现的方案,已经有其他方法存在相同的方案,那么则可以使用方法引用。

常见的引用方式:

方法引用在JDK8中使用是相当灵活的,有以下几种形式:

instanceName::methodName 对象::方法名ClassName::staticMethodName 类名::静态方法ClassName::methodName 类名::普通方法ClassName::new 类名::new 调用的构造器TypeName[]::new String[]::new 调用数组的构造器

2.1 对象名::方法名

这是最常见的一种用法。如果一个类中的已经存在了一个成员方法,则可以通过对象名引用成员方法

public static void main(String[] args) { Date now = new Date(); Supplier supplier = ()->{return now.getTime();}; System.out.println(supplier.get()); // 然后我们通过 方法引用 的方式来处理 Supplier supplier1 = now::getTime; System.out.println(supplier1.get()); }

方法引用的注意事项:

被引用的方法,参数要和接口中的抽象方法的参数一样当接口抽象方法有返回值时,被引用的方法也必须有返回值

2.2 类名::静态方法名

也是比较常用的方式:

public class FunctionRefTest04 { public static void main(String[] args) { Supplier supplier1 = ()->{ return System.currentTimeMillis(); }; System.out.println(supplier1.get()); // 通过 方法引用 来实现 Supplier supplier2 = System::currentTimeMillis; System.out.println(supplier2.get()); }}

2.3 类名::引用实例方法

Java面向对象中,类名只能调用静态方法,类名引用实例方法是用前提的,实际上是拿第一个参数作为方法的调用者

package com.bobo.jdk.funref;import java.util.Date;import java.util.function.BiFunction;import java.util.function.Function;import java.util.function.Supplier;public class FunctionRefTest05 { public static void main(String[] args) { Function function = (s)->{ return s.length(); }; System.out.println(function.apply("hello")); // 通过方法引用来实现 Function function1 = String::length; System.out.println(function1.apply("hahahaha")); BiFunction function2 = String::substring; String msg = function2.apply("HelloWorld", 3); System.out.println(msg); }}

2.4 类名::构造器

由于构造器的名称和类名完全一致,所以构造器引用使用​​::new​​的格式使用,

public class FunctionRefTest06 { public static void main(String[] args) { Supplier sup = ()->{return new Person();}; System.out.println(sup.get()); // 然后通过 方法引用来实现 Supplier sup1 = Person::new; System.out.println(sup1.get()); BiFunction function = Person::new; System.out.println(function.apply("张三",22)); }}

2.5 数组::构造器

数组是怎么构造出来的呢?

public static void main(String[] args) { Function fun1 = (len)->{ return new String[len]; }; String[] a1 = fun1.apply(3); System.out.println("数组的长度是:" + a1.length); // 方法引用 的方式来调用数组的构造器 Function fun2 = String[]::new; String[] a2 = fun2.apply(5); System.out.println("数组的长度是:" + a2.length); }

小结:方法引用是对Lambda表达式符合特定情况下的一种缩写方式,它使得我们的Lambda表达式更加的精简,也可以理解为lambda表达式的缩写形式,不过要注意的是方法引用只能引用已经存在的方法。

~好了,方法引用的内容就介绍到这儿,如果对你有帮助,欢迎点赞关注加收藏哦

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:win10永久设置护眼颜色
下一篇:关于 NoSQL 数据库你应该了解的 10 件事
相关文章

 发表评论

暂时没有评论,来抢沙发吧~