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());

七、方法引用应用

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

java8中class怎么用_Java8中你可能不知道的一些地方之方法引用实战相关推荐

  1. java 8 lamda,Java8中你可能不知道的一些地方之Lambda表达式实战

    Java8 引入 Lambda 表达式,允许开发者将函数当成参数传递给某个方法,或者把代码本身当作数据进行处理.使用 Lambda 表达式,使得应用变得简洁而紧凑. 很多语言(Groovy.Scala ...

  2. java function void_Java8中你可能不知道的一些地方之函数式接口实战

    什么时候可以使用 Lambda?通常 Lambda 表达式是用在函数式接口上使用的.从 Java8 开始引入了函数式接口,其说明比较简单:函数式接口(Functional Interface)就是一个 ...

  3. java8实战怎么样_Java8中你可能不知道的一些地方之Stream实战

    说起流,我们会想起手机 ,电脑组装流水线,物流仓库商品包装流水线等等.如果把手机 ,电脑,包裹看做最终结果的话,那么加工商品前的各种零部件就可以看做数据源,而中间一系列的加工作业操作,就可以看做流的处 ...

  4. Java中lambda表达式去重_JAVA8中Lambda和Stream

    Java8于2014年3月份发布,其主要更新的特性有:函数式接口.Lambda 表达式.集合的流式操作.注解的更新.安全性的增强.IO\NIO 的改进.完善的全球化功能等,本文将介绍Lambda表达式 ...

  5. java8 时间加一秒_Java8中对时间的处理

    Java8中对时间的处理主要是LocalDate.LocalTime.LocalDateTime这几个类实现,直接看下面的测试代码,注释很详细. @ java8时间处理测试 /** * java8时间 ...

  6. java8 时间加一秒_Java8中新增的日期和时间API

    1.计算时间间隔 Java8之前,我们想要确定一个方法的运行时间长度,可以这样: long start = System.currentTimeMillis(); doSomething(); lon ...

  7. java中eden是什么_java8 中的 new generation 、young generation 和 eden space是怎样的关系?...

    这是暂时我找到的官方性质的说明,该说明我是在 java version "1.8.0_211" 的jmap -heap 找到的,java version "1.8.0_1 ...

  8. matlab中input输入多个数_你可能不知道的MATLAB操作技巧#第二话

    回顾链接  这是#第一话#的超链接,让大家对MATLAB有一个感性认识. 第二话 1-梳理一下MATLAB中的字符char.符号变量symbol和数值型变量double等的区别.经过图图长时间调研,发 ...

  9. es6中reduce的用法_25个你不得不知道的数组reduce高级用法

    背景 距离上一篇技术文章<1.5万字概括ES6全部特性>发布到现在,已经有整整4个月没有输出过一篇技术文章了.哈哈,不是不想写,而是实在太忙,这段时间每天不是上班就是加班,完全没有自己的时 ...

最新文章

  1. VM虚拟机报错:An error occurred during the file system check.
  2. matlab单元数组与结构体的区别,MATLAB中的结构体和单元数组
  3. 常见 Serverless 架构模式
  4. iOS开发Swift篇—(七)函数(1)
  5. Nignx出现failed (3: The system cannot find the path specified)问题
  6. Hadoop优势,生态圈
  7. swift函数的用法,及其嵌套实例
  8. 一些思维的碎片(二)
  9. [Java] 蓝桥杯BASIC-24 基础练习 龟兔赛跑预测
  10. 服务器经过交换机传递文件丢失,H3C交换机bin文件丢失后补救方案
  11. 深入浅出选择类排序算法(简单选择排序,堆排序)
  12. html如何添加阿里图标,CSS引入阿里iconfont图标步骤
  13. CentOS 查看日志命令
  14. odoo 慎用related(计算字段)
  15. 计算机中寄存器的定义,寄存器,寄存器是什么意思
  16. 成都拓嘉启远:拼多多下单后地址错误能改吗
  17. qt linux不能读写u盘文件,Qt读取U盘文件内容
  18. VM8 asdebug.js:1 GET http://192.168.1.106:7101/GOODS/G-F-Kill net::ERR_CONNECTION_REFUSED
  19. 《第1阶段》——正交试验法
  20. PPT封面反转镂空文字

热门文章

  1. 云原生是全云开发的敲门砖?蒋涛独家对话阿里云贾扬清、华先胜等大咖
  2. 微信“拍一拍”新增“炸一炸”功能;爱奇艺 CEO:会费涨价是行业必然趋势;微软终止 Windows 10X 开发|极客头条...
  3. iPhone:你知道这 13 年我是怎么过的吗?
  4. 领英·影响力2020:职场人再定位,千里马伯乐新论
  5. 刚发布!开发者调查报告:机器学习/深度学习算法工程师急缺
  6. 我帮公司财务写了个“群发工资条”的 Python 脚本!
  7. 从 4 个月到 7 天:Netflix 开源自家框架 Metaflow,性能像坐上了火箭
  8. 微信小程序发力搜索,开发者变现难,揭秘小程序行业真实现状
  9. 群聊太多?三步教你用 Python 自动监听转发群消息
  10. 4G + 1G = 5G?