Java8新特性笔记--波哥带你学JAVA--方法引用

  • 1.为什么要用方法引用
    • 1.1 Lambda表达式冗余
    • 1.2 解决方案
  • 2.方法引用的格式
    • 2.1 对象名::方法名
    • 2.2 类名::静态方法
    • 2.3 类名::普通方法
    • 2.4 类名::构造器
    • 2.5 数组::构造器

1.为什么要用方法引用

1.1 Lambda表达式冗余

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

public class Demo01FunctionRef {public static void main(String[] args) {printMax(a->{getTable(a);});}/*** 求数组中的所有元素的和* @param a*/public static void getTable(int[] a){int sum = 0;for (int i : a) {sum+=i;}System.out.println(sum);}private static void printMax(Consumer<int[]> consumer){int[] a = {10,20,30,40,50,60};consumer.accept(a);}
}
1.2 解决方案

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

public class Demo02FunctionRef {public static void main(String[] args) {//::方法的引用printMax(Demo02FunctionRef::getTable);}/*** 求数组中的所有元素的和* @param a*/public static void getTable(int[] a){int sum = 0;for (int i : a) {sum+=i;}System.out.println(sum);}private static void printMax(Consumer<int[]> consumer){int[] a = {10,20,30,40,50,60};consumer.accept(a);}
}

2.方法引用的格式

符号表示: ::
符号说明:双冒号为方法引用运算符,而他所在的表达式被称为方法的引用
应用场景:如果Lambda表达式所要实现的方案,已经有其他方法存在相同的方案,那么则可以使用方法的引用
常见的引用方式:
方法的引用在jdk8中使用是相当灵活的,有以下几种形式:
1.instanceName::methodName 对象::方法名
2.ClassName::staticMethodName 类名::静态方法
3.ClassName::methodName 类名::普通方法
4.ClassName::new 类名::new调用的构造器
5.TypeName[]::new String[]::new 调用数组的构造器

2.1 对象名::方法名

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

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

方法引用的注意事项:
1.被引用的方法,参数要和接口中的抽象方法的参数一样
2.当借口抽象方法有返回值是,被引用的方法也必须有返回值

2.2 类名::静态方法
public class Demo04FunctionRef {public static void main(String[] args) {Supplier<Long> supplier = ()->{return System.currentTimeMillis();};System.out.println(supplier.get());// 通过 方法引用 来实现Supplier<Long> supplier1 = System::currentTimeMillis;System.out.println(supplier1.get());}
}
2.3 类名::普通方法

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

public class Demo05FunctionRef {public static void main(String[] args) {Function<String,Integer> function = s -> {return s.length();};System.out.println(function.apply("hello"));//通过 方法引用 实现Function<String,Integer> function1 = String::length;System.out.println(function1.apply("world"));BiFunction<String,Integer,String> biFunction = String::substring;System.out.println(biFunction.apply("hello world",2));}
}
2.4 类名::构造器

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

public class Demo06FunctionRef {public static void main(String[] args) {Supplier<Person> supplier = ()->{return new Person();};System.out.println(supplier.get());// 通过 方法引用 实现Supplier<Person> supplier1 = Person::new;System.out.println(supplier1.get());}
}
2.5 数组::构造器

如何构造数组

public class Demo07FunctionRef {public static void main(String[] args) {Function<Integer,String[]> function = (len)->{return new String[len];};String[] apply = function.apply(2);System.out.println("数组的长度是="+apply.length);Function<Integer,String[]> function1 = String[]::new;String[] apply1 = function1.apply(3);System.out.println("数组的长度是="+apply1.length);}
}

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

本人代码笔记gitee地址:https://gitee.com/FredHeYuTong/learn-java8

Java8新特性笔记--波哥带你学JAVA--方法引用相关推荐

  1. java8新特性-stream对map集合进行过滤的方法

    java8新特性-stream对map集合进行过滤的方法 stream对map集合进行过滤的方法

  2. Java8新特性 - Stream - 13 - Stream的max()、min()方法详解

    1.方法介绍 [方法签名]1.Optional<T> max(Comparator<? super T> comparator);2.Optional<T> min ...

  3. Java8新特性学习笔记

    Java8新特性学习笔记 文章目录 Java8新特性学习笔记 一.接口和日期处理 1.接口增强 1.1.JDK8以前 VS JDK8 1)接口定义: 1.2.默认方法(default) 1)默认方法格 ...

  4. 【Java学习笔记之二十八】深入了解Java8新特性

    前言: Java 8 已经发布很久了,很多报道表明java 8 是一次重大的版本升级.在Java Code Geeks上已经有很多介绍Java 8新特性的文章,例如Playing with Java ...

  5. java8新特性学习笔记(Lambda,stream(),filter(),collect(),map())

    文章目录 1.lambda表达式(重点) 1.需求分析 2.Lambda表达式初体验 3.Lambda的语法规则 3.1 Lambda练习1 3.1 Lambda练习2 4.Lambda表达式的原理 ...

  6. 快速学习Java8新特性第七讲——Optional类

    在<快速学习Java8新特性第五讲--强大的Stream API>这一讲中,我就已经提及到了Optional类.在这一讲中,我将对其做一个更加细致的讲解. Optional类是什么? Op ...

  7. 放大招了,肝了一篇8万字的Java8新特性总结,赶快收藏

    大家好,我是冰河~~ 说实话,肝这篇文章花了我一个月的时间,关于Java8的新特性全在这儿了,建议先收藏后阅读. Java8有哪些新特性? 简单来说,Java8新特性如下所示: Lambda表达式 函 ...

  8. 青空の霞光Java新特性笔记

    Java新特性介绍 **注意:**推荐完成此路线所有前置内容后,再来学习本篇. 经过前面的学习,我们基本已经了解了Java 8及之前的所有语法,不过,Java 8是Oracle 公司于 2014 年 ...

  9. Java8新特性Stream流详解

    陈老老老板 说明:新的专栏,本专栏专门讲Java8新特性,把平时遇到的问题与Java8的写法进行总结,需要注意的地方都标红了,一起加油. 本文是介绍Java8新特性Stream流常用方法超详细教学 说 ...

  10. Java8新特性学习记录

    前言: Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.在Java Code Geeks上已经有很多介绍Java 8新特性的文章, 例如Playing with Java ...

最新文章

  1. 欧文分校计算机新sat多少分录取,加州大学欧文分校SAT成绩要求是多少?
  2. python 命令行参数-Python3 命令行参数
  3. vs2015 + opencv3.4 配置
  4. 基于CDS view自动生成的OData服务,是如何实现read操作的
  5. Stateless 3.0——.NET Core上的状态机库
  6. VLAN访问控制列表(VACL)的配置方法
  7. java常见面试题及答案(基础题122道,代码题19道),java高级面试笔试题
  8. python 重命名文件出现乱码_下载的文件名总是「乱码」?这里有各平台的解决方法...
  9. 如何七周成为数据分析师
  10. Springboot Excle导入导出
  11. 典型相关分析(cca)原理_全网最细的图文详解——手把手教你不会代码一样做RDA/CCA分析!...
  12. java全栈工程师培训,分享面经
  13. 电脑启动项,电脑启动项设置,详细教您怎么设置开机启动项
  14. C语言入门检验身份证号码最后一位
  15. Python实现量化选股
  16. 重学设计模式 - Facade模式
  17. 基于微信小程序的学生请假系统开发
  18. 【imessage苹果推】软件安装CSR文件将尽可能区分每个证书
  19. 儿童上网时间管控软件_GreenSurfOnline V0.1 使用说明 (以Windows后台服务形式存在,安装需要有一定电脑操作基础)...
  20. iOS 简单动画效果

热门文章

  1. 如何在MongoDB上备份和恢复数据?
  2. 香草 jboss 工具_香草JavaScript中的记忆游戏
  3. 国产工具系统型号表示方法
  4. 由“量子通信”想到“马蓉劈叉”
  5. 智慧档案馆十防一体化建设一些主要设计依据
  6. 用C++做一个简单的下课提醒
  7. PowerDesigner16x64_Evaluation下载安装
  8. mysql从一个表更新数据到另一个表中_sql怎样把一个表的数据更新到另一个表
  9. LG P2155 【SDOI2008】 沙拉公主的困惑 解题报告
  10. Deqin -德钦牌计算器