Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。 方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。

计算时,方法引用会创建函数式接口的一个实例。 当 Lambda 表达式中只是执行一个方法调用时,不用 Lambda 表达式,直接通过方法引用的形式可读性更高一些。方法引用是一种更简洁易懂的 Lambda 表达式。

一、语法

目标引用:方法名称

目标引用:类名、实例对象

方法名称:实例方法名、静态方法名

等效 Lambda 的方法引用示例如下:

二、方法引用分类

Java8 中对于方法引用主要分为四大类:构造器引用

Class::new

静态方法引用

Class::static_method

实例对象方法引用

Instance::method

特定类型任意对象的实例方法引用

Class:: method

三、构造器引用

语法是Class::new,或者更一般的Class< T >::new实例如下:

/**

* Lambda 表达式 实例化User 对象

*/

Supplier s01 =()->new User();

Function  f01 = (id)->{

return new User(id);

};

f01.apply(2019);

BiFunction bf01 = (id,uname)->{

return new User(id,uname);

};

bf01.apply(2019,"admin");

//方法引用 等价写法

Supplier s02 = User::new;

Function f02 = User::new;

f02.apply(2019);

BiFunction bf02 = User::new;

bf02.apply(2019,"admin");

四、静态方法引用

语法是Class::static_method,实例如下:

// 判断字符串是否为空串

Function f03 = (str)-> StringUtils.isBlank(str);

System.out.println(f03.apply(""));

// Base64 对输入字符串执行编码操作

Supplier s01 = ()->Base64.getEncoder();

s01.get().encodeToString("java8 is so easy!!!".getBytes());

Function f04 = StringUtils::isBlank;

System.out.println(f04.apply(""));

Supplier s02 = Base64::getEncoder;

s02.get().encodeToString("java8 is so easy!!!".getBytes());

五、实例对象方法引用

语法是Instance::method ,此时引用方法时必须存在实例,示例如下:

//方法引用构造User 对象

BiFunction bf02 = User::new;

User u02 = bf02.apply(2019,"admin");

// 调用实例对象方法

Supplier s01 = ()->u02.getUserName();

System.out.println(s01.get());

// 方法引用 等价Lambda 写法

Supplier s02 = u02::getUserName;

System.out.println(s02.get());

六、特定类型任意对象的实例方法引用

语法是Class:: method,第四种类型比较特殊,这里特定类型指多个对象类型说的,对象类型属于同一类类型通常是一个集合,元素类型一致,此时可以对类方法实现引用。

/**

准备测试数据

**/

List list= Arrays.asList(10,2,30,5,8,10,60,99,101);

List emails = Arrays.asList("126@126.com"," ","","java8@163.com");

Goods g01=new Goods(1,"小米9",1789,200, BigDecimal.valueOf(2500));

Goods g02=new Goods(2,"华为Mate20",5000,3000, BigDecimal.valueOf(7000));

Goods g03=new Goods(3,"OPPO R17",2000,2827, BigDecimal.valueOf(1500));

Goods g04=new Goods(4,"魅族 Note9",2000,1600, BigDecimal.valueOf(1600));

Goods g05=new Goods(5,"一加6T",8000,5000, BigDecimal.valueOf(3500));

List goods= Arrays.asList(g01,g02,g03,g04,g05);

// Lambda 对集合list元素排序 list 存放整数元素

list.sort((a1,a2)->a1-a2);

// Lambda 对集合goods 按销量排序

goods.sort((g1,g2)->g1.getSale()-g2.getSale());

// 过滤邮箱集合空串

emails.stream().filter((e) -> StringUtils.isNoneBlank(e))

.collect(Collectors.toList());

// 任意对象的实例方法引用 对集合list元素排序

list.sort(Comparator.comparing(Integer::intValue));

// 任意对象的实例方法引用 对集合goods 按销量排序

goods.sort(Comparator.comparing(Goods::getSale));

// 过滤邮箱集合空串

emails.stream().filter(StringUtils::isNoneBlank).collect(Collectors.toList());

如果你现在也在自学 Java,在学 Java 的过程当中缺乏基础入门的视频教程,或者说在自学 Java 的过程中有遇见任何关于学习方法,学习路线,学习效率等方面的问题,你都可以随时来找女老师交流:lezijie007,记得程序员暗号999

七、方法引用应用

方法引用简化了 Lambda 表达式书写方式,对于函数式接口实现可以使用方法引用来替换 Lambda,当对 Lambda 掌握后使用方法引用时代码会变得更加简洁、自然 。

java过滤4字节_乐字节Java8核心特性实战之四:方法引用相关推荐

  1. java垃圾回收机制_乐字节Java|GC垃圾回收机制、package和import语句

    本文接上一篇:乐字节Java|this关键字.static关键字.block块.本文是接着讲述JavaGC垃圾回收机制.package 和 import语句. 一.GC垃圾回收机制 GC全名:Garb ...

  2. Java8新特性总结 - 4.方法引用

    所有示例代码打包下载 : 点击打开链接 Java8新特性 :  接口新增默认方法和静态方法 Optional类 Lambda表达式 方法引用 Stream API - 函数式操作流元素集合 Date/ ...

  3. optional判断是否为空_乐字节Java8核心特性之Optional

    小伙伴们,上次小乐给大家详细介绍了Java8核心特性的Stream(流),点击可以回顾哦. 乐字节:乐字节Java8核心特性实战-Stream流​zhuanlan.zhihu.com Optional ...

  4. Java基础学习——第十六章 Java8新特性

    Java基础学习--第十六章 Java8 新特性 Java8(JDK8.0)较 JDK7.0 有很多变化或者说是优化,比如 interface 里可以有静态方法和默认方法,并且可以有方法体,这一点就颠 ...

  5. Java8 新特性实战

    Java8 新特性实战 本文来自cowbi的投稿~ Oracle 于 2014 发布了 Java8(jdk1.8),诸多原因使它成为目前市场上使用最多的 jdk 版本.虽然发布距今已将近 7 年,但很 ...

  6. 【java8新特性】——默认方法(五)

    一.简介 默认方法是指接口的默认方法,它是java8的新特性之一.顾名思义,默认方法就是接口提供一个默认实现,且不强制实现类去覆写的方法.默认方法用default关键字来修饰. 默认方法可以解决的痛点 ...

  7. java8新特性_乐字节-Java8新特性-接口默认方法

    总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性. Java8 新特性列表如下: 接 ...

  8. java 获取 反射 方法 名_乐字节Java反射之一:反射概念与获取反射源头Class

    一.Java反射机制概念 "程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言",如Python, Ruby是动态语言:显然C++,Java,C#不是动态语言,但是JAV ...

  9. for循环如果先--_乐字节Java循环:循环控制和嵌套循环

    乐字节小乐上次讲完了Java反射,接下来小乐给大家讲述Java循环. 循环有以下四部分: Java循环 一.循环控制 1. do..while 直到型 ( 先执行后判断) ,结构为: 先执行循环体,后 ...

最新文章

  1. 【Enterprise Manager 12c】如何在EM 12c中配置Exadata Infiniband告警邮件
  2. 【Android 安装包优化】p7zip 源码交叉编译 Android 平台可执行程序 ( 下载 p7zip 源码 | 交叉编译 Android 中使用 7z 可执行程序 )
  3. RabbitMQ AMQP MessageConverter 消息转换器 PDF Image Text 文本 图片 PDF json
  4. ES6中的迭代器(Iterator)和生成器(Generator)(一)
  5. 仿真文件的写法(以四位全加器为例)
  6. loj#6433. 「PKUSC2018」最大前缀和(状压dp)
  7. Notepad++ WebEdit插件
  8. 华为ensp命令大全_计算机网络 实验六----eNSP基础解答
  9. 如何通过OWA登录界面修改域用户的密码
  10. 微软运行库合集 |VC9、VC11、VC14、VC15库 32位 64位|v2019.3.2(3264位)最新版 phpstudy vc9-vc14运行库
  11. HIbernate Mappedby
  12. Go开发关键技术指南
  13. Photoshop学习之旅--通道抠图
  14. 基于三维卷积网络的时空特征学习
  15. 这套精美的开源数据报表模板,美呆了
  16. sql2000 指定的服务器不存在,SQL Server 2000服务无法启动,提示“系统找不到指定的文件”解决方法及sp4安装不上...
  17. java设计建议植物大战僵尸_基于Java的游戏设计之植物大战僵尸
  18. HaaS学习笔记 | 终端设备接入和断开阿里云IoT物联网平台的明细教程
  19. 3. Base64用途和原理
  20. 微信小程序 | 基于云数据库的许愿墙

热门文章

  1. 会话管理:Session与Cookie
  2. 2.2.1操作系统之处理机调度的概念及层次
  3. echart饼图标签重叠_Echarts 解决饼图文字过长重叠的问题
  4. Cpp / 通用引用、引用折叠与完美转发问题
  5. 启明云端分享| 盘点 ESP32-S3到底有哪些功能特性
  6. mysql存储过程大于小于_mysql5.0存储过程操作符知识_函数方法[Mysql学习]
  7. Arduino--超声波
  8. 百度智能云大数据全景架构图如何赋能企业数字化
  9. boot返回码规范 spring_SpringBoot 系列 web 篇之自定义返回 Http Code 的 n 种姿势
  10. 数值计算方法在计算机的应用,数值计算方法在计算机科学中的应用和误差序列实验推荐.doc...