上一篇小乐介绍了《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新特性之方法引用的更多相关文章

  1. 乐字节Java8核心特性之方法引用

    大家好,我是乐字节的小乐,上一次我们说到了Java8核心特性之函数式接口,接下来我们继续了解Java8又一核心特性--方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引 ...

  2. 乐字节-Java8新特性-接口默认方法

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

  3. 乐字节-Java8新特性之Base64和重复注解与类型注解

    上一篇小乐给大家说了<乐字节-Java8新特性之Date API>,接下来小乐继续给大家说一说Java8新特性之Base64和重复注解与类型注解. 一.Base64 在Java 8中,内置 ...

  4. 乐字节-Java8新特性之Stream流(上)

    上一篇文章,小乐给大家介绍了<Java8新特性之方法引用>,下面接下来小乐将会给大家介绍Java8新特性之Stream,称之为流,本篇文章为上半部分. 1.什么是流? Java Se中对于 ...

  5. 乐字节-Java8新特性之函数式接口

    上一篇小乐带大家学过 Java8新特性-Lambda表达式,那什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口 ...

  6. 乐字节-Java8新特性-接口默认方法之Stream流(下)

    接上一篇:<Java8新特性之stream>,下面继续接着讲Stream 5.流的中间操作 常见的流的中间操作,归为以下三大类:筛选和切片流操作.元素映射操作.元素排序操作: 操作 描述 ...

  7. 乐字节-Java8新特性之Date API

    上一篇文章,小乐给大家带来了Java8新特性之Optional,接下来本文将会给大家介绍Java8新特性之Date API 前言: Java 8通过发布新的Date-Time API来进一步加强对日期 ...

  8. 乐字节-Java8新特性之Optional

    上一篇小乐带大家了解了Java新特性之Stream,接下来将会继续述说Java新特性之Optional Optional<T>类(java.util.Optional)是一个容器类,代表一 ...

  9. Java8新特性之方法引用&Stream流

    Java8新特性 方法引用 前言 什么是函数式接口 只包含一个抽象方法的接口,称为函数式接口. 可以通过 Lambda 表达式来创建该接口的对象.(若 Lambda 表达式抛出一个受检异常(即:非运行 ...

随机推荐

  1. .net core 使用 AspectCore 实现简易的AopCache。

    (第一次写博客,好紧张!!!) 源码地址:传送门 项目中有很多缓存的需求,能自己定义缓存key和时间,能根据key去清理缓存. 网上找了一圈,有很多基于aop的缓存组件,但是都不满足我的需求.故造了个 ...

  2. C# Winform 换肤

    本来计划接着上篇 C# Winform模仿百度日历,发现一时半会写不完,只写了一小半还不全,暂且搁置下.现在计划下班后每天至少写一篇博客,未能完成的等周末(不加班都情况)补充完整. 本篇博客窗体换肤, ...

  3. WPF 触摸屏小键盘样式

    WPF程序,用于平板时,一些输入数量的地方我们需要弹出小键盘输入,这个键盘可以调系统的,也可以自己写. 分享个我现在用的一个数字键盘界面. <Window xmlns:dxe="htt ...

  4. 全世界最顶级黑客同时沸腾在DEF CON 25,是怎样一种体验?

    2017,我在这里!圆你黑客梦!!   被称为黑客“世界杯”与“奥斯卡”的美国黑帽技术大会Black Hat和世界黑客大会DEF CON 是众多黑客心中最神圣的梦!   有位小表弟告诉我说:Black ...

  5. ASP.NET Core 2.0 多应用实现Cookie共享

    前言 .NET Core 2.0 发布之后,在Authentication中间件部分,相关API有不少改动(官方文档),本文主要讲的就是实现应用Cookie共享,对Cookie中间件使用不了解的可以去 ...

  6. Flask-socketio聊天室 (附源码)

    `* A Chat Room Completed with Flask-socketio 功能: 实时消息更新,实时用户上线显示 快捷注册 快捷登陆 表情支持 截图: 使用方法: 安装依赖:pip i ...

  7. keytool和openssl生成的证书转换

    keytool和openssl生成的证书转换 keytool生成证书示例 生成私钥+证书: keytool -genkey -alias client -keysize 2048 -validity ...

  8. Webflux快速入门

    SpringWebflux是SpringFramework5.0添加的新功能,WebFlux本身追随当下最火的Reactive Programming而诞生的框架,那么本篇就来简述一下这个框架到底是做 ...

  9. [原] ubuntu 13.10 安装 winqq2013

    安装及下载地址:http://www.longene.org/forum/viewtopic.php?t=4700 ubuntu 13.10 64位系统安装后无法启动qq,因为缺少程序包.解决方案: ...

  10. JavaScript -- FileSystemObject

    -----056-FileSystemObject.html----- <!DOCTYPE html> <html> <head> <meta http-eq ...