乐字节-Java8新特性之方法引用
上一篇小乐介绍了《Java8新特性-函数式接口》,大家可以点击回顾。这篇文章将接着介绍Java8新特性之方法引用。
Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。 方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。计算时,方法引用会创建函数式接口的一个实例。 当Lambda表达式中只是执行一个方法调用时,不用Lambda表达式,直接通过方法引用的形式可读性更高一些。方法引用是一种更简洁易懂的Lambda表达式。
1、基本格式
方法引用使用一对冒号 :: 来简化对象方法的调用,当你想要使用方法引用时,目标引用放在分隔符 :: 前,方法名称放在后面, 如下形式:
方法引用参考示例:
2、方法引用分类
Java8 中对于方法引用主要分为三大类:
构造器引用 Class::new
静态方法引用 Class::static_method
特定对象的方法引用 instance::method
2.1、构造器引用
语法是Class::new,或者更一般的Class< T >::new实例如下
借助构造器引用实例化Iphone 对象,代码如下:
public class IPhone {
private Integer id;
private String version;
private Date createTime;
private String name;
public IPhone() {
}
public IPhone(Integer id) {
this.id = id;
}
public IPhone(Integer id, String name) {
this.id = id;
this.name = name;
}
...
}
public static void main(String[] args) {
/**
* 构造器引用
* 无参构造器
*/
// 实现Supplier 接口 通过构造器引用
Supplier<IPhone> factory01= IPhone::new;
IPhone p01 = factory01.get();
System.out.println(p01);
/**
* 等价的Lambda 写法
*/
Supplier<IPhone> factory02 = ()->new IPhone();
IPhone p02 = factory02.get();
System.out.println(p02); /**
* 当构造器方法存在参数 参数个数为1个时
*/
Function<Integer,IPhone> factory03 = IPhone::new;
IPhone p03 = factory03.apply(2019);
System.out.println(p03);
/**
* 等价的Lambda 写法
*/
Function<Integer,IPhone> factory04 = (id)-> new IPhone(id);
IPhone p04 = factory04.apply(2019);
System.out.println(p04); /**
* 当构造器方法存在参数 参数个数为2个时
*/
BiFunction<Integer,String,IPhone> factory05 = IPhone::new;
IPhone p05 = factory05.apply(2019,"iphoneX");
System.out.println(p05);
/**
* 等价的Lambda 写法
*/
BiFunction<Integer,String,IPhone> factory06 = (id,name)-> new IPhone(id,name);
IPhone p06 = factory06.apply(2019,"iphoneMax");
System.out.println(p06);
/**
当构造器参数参过2个时怎么解决呢???
**/
}
2.2、静态方法引用
语法是Class::static_method,实例如下:
使用静态方法引用 执行IPhone 静态方法
public class IPhone {
private Integer id;
private String version;
private Date createTime;
private String name; public IPhone() {
} public IPhone(Integer id) {
this.id = id;
} public IPhone(Integer id, String name) {
this.id = id;
this.name = name;
} /**
静态方法
*/
public static void info(){
System.out.println("这是一部IPhone");
}
} /**
* 定义函数式接口
*/
@FunctionalInterface
public interface PrintFunction{
void print();
} // 静态方法引用
PrintFunction pf01= IPhone::info;
pf01.print();
/**
* 等价的Lambda 写法
*/
PrintFunction pf02 = () -> {
IPhone.info();
};
pf02.print(); // 静态方法引用 静态方法存在参数时
/**
* 定义函数式接口
*/
@FunctionalInterface
public interface PrintFunction02<T,R> {
R print(T t);
} /**
* 静态方法引用 方法存在参数时
*/
PrintFunction02<String,Double> pf03 = IPhone::getPrice;
System.out.println(pf03.print("iphone")); /**
* 等价的Lambda 写法
*/
PrintFunction02<String,Double> pf04 =(str)->{
return IPhone.getPrice(str);
};
2.3、特定类的任意实例化对象的方法引用
语法是instance::method ,此时引用方法时必须存在实例,示例代码如下:
/**
* 构造器引用 实例化对象
* 成员方法引用
*/
BiFunction<Integer,String,IPhone> factory07= IPhone::new;
IPhone p07 = factory07.apply(2019,"iphoneX");
PrintFunction pp= p07::mm;
pp.print(); /**
* 等价的Lambda 写法
*/
BiFunction<Integer,String,IPhone> factory08 = (id,name)-> new IPhone(id,name);
IPhone p08 = factory08.apply(2019,"iphoneMax");
PrintFunction pp02 = ()->{
p08.mm();
};
pp02.print();
2.4 类的成员方法引用
(略)
接下来,小乐会继续介绍Java8新特性之Stream,敬请期待。欢迎关注乐字节,记得评论点赞哦。
转发请记得注明出处和作者。
乐字节-Java8新特性之方法引用的更多相关文章
- 乐字节Java8核心特性之方法引用
大家好,我是乐字节的小乐,上一次我们说到了Java8核心特性之函数式接口,接下来我们继续了解Java8又一核心特性--方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引 ...
- 乐字节-Java8新特性-接口默认方法
总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性. Java8 新特性列表如下: 接 ...
- 乐字节-Java8新特性之Base64和重复注解与类型注解
上一篇小乐给大家说了<乐字节-Java8新特性之Date API>,接下来小乐继续给大家说一说Java8新特性之Base64和重复注解与类型注解. 一.Base64 在Java 8中,内置 ...
- 乐字节-Java8新特性之Stream流(上)
上一篇文章,小乐给大家介绍了<Java8新特性之方法引用>,下面接下来小乐将会给大家介绍Java8新特性之Stream,称之为流,本篇文章为上半部分. 1.什么是流? Java Se中对于 ...
- 乐字节-Java8新特性之函数式接口
上一篇小乐带大家学过 Java8新特性-Lambda表达式,那什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口 ...
- 乐字节-Java8新特性-接口默认方法之Stream流(下)
接上一篇:<Java8新特性之stream>,下面继续接着讲Stream 5.流的中间操作 常见的流的中间操作,归为以下三大类:筛选和切片流操作.元素映射操作.元素排序操作: 操作 描述 ...
- 乐字节-Java8新特性之Date API
上一篇文章,小乐给大家带来了Java8新特性之Optional,接下来本文将会给大家介绍Java8新特性之Date API 前言: Java 8通过发布新的Date-Time API来进一步加强对日期 ...
- 乐字节-Java8新特性之Optional
上一篇小乐带大家了解了Java新特性之Stream,接下来将会继续述说Java新特性之Optional Optional<T>类(java.util.Optional)是一个容器类,代表一 ...
- Java8新特性之方法引用&Stream流
Java8新特性 方法引用 前言 什么是函数式接口 只包含一个抽象方法的接口,称为函数式接口. 可以通过 Lambda 表达式来创建该接口的对象.(若 Lambda 表达式抛出一个受检异常(即:非运行 ...
随机推荐
- ASP.NET WebAPI (反)序列化用[SerializableAttribute]修饰的类的一个坑
发现问题 在 ASP.NET WebAPI 项目中,有这样的 ViewModel 类: [Serializable] class Product { public int Id { get; set; ...
- 在ASP.NET MVC应用中开发插件框架(中英对照)
[原文] Developing a plugin framework in ASP.NET MVC with medium trust [译文] 在ASP.NET MVC应用中开发一个插件框架 I’v ...
- .net图表之ECharts随笔05-不同01的语法步骤
找了好久,一直没找到可用的热力图heatmap.js. 应该说,使用01中的语法一直都无法实现热力图.只能说我太菜了... 现在急于求成,我找了另一种语法来调用ECharts.此种语法的js文件集是从 ...
- 使用ActionFilterAttribute实现MVC后台授权
授权就是我们在用户未登录的情况下不允许访问一些页面,只有登录后才能进行访问一些页面. 在mvc中我们可以使用ActionFilterAttribute来进行授权验证来阻止一些未经授权的直接访问的页面. ...
- apache ab
ab -p postfile.json -T 'application/json' -n 100 -c 10 -v 2 http://192.168.1.103:3002/checkStashSlot ...
- [Visual Studio] 记一次排错:打不开 Nuget 包管理器里的安装package页面,无法 安装 / 恢复 包
出差一阵子PC很久没用了, 回来在用Visual Studio (2017) 的时候, 工程里无法安装Package了 >_< --- 也不知道电脑做了什么?--- Nuget包管 ...
- javascript 模块化学习:Class打包出来无法实例化问题
菜鸟初学前端,第一次尝试使用webpack, 目的是做一个lib,想用webpack + babel 自动化打包出来 es5 的js代码 模块中用到了Class,直接export{className} ...
- pinnet 计算云分区
fdisk /dev/xvdemne mnlEnterEnter 9G-98G-98G-478M-28G-28G-28G mw #设置文件格式mkfs -t ext4 /dev/xvde5mkfs - ...
- [工具]渗透神器CobaltStrike 3.1.2 K8去后门破解版 & Windows版TeamServer
CS简介 Cobalt Strike(简称CS)是全球黑客公认一款非常优秀的渗透测试神器,以metasploit为基础的GUI的框架式渗透工具,集成了传统远控功能(远程桌面VNC.键盘记录.CmdSh ...
- 10-01 Java 类,抽象类,接口的综合小练习--运动员和教练
运动员和教练的案例分析 运动运和教练的案例 代码实现 /* 教练和运动员案例 乒乓球运动员和篮球运动员. 乒乓球教练和篮球教练. 为了出国交流,跟乒乓球相关的人员都需要学习英语. 请用所学知识: 分析 ...