上一篇小乐介绍了《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. 【vue】项目编译报错‘npm ERR! **@**dev: `webpack-dev-server --inline --progress --config ’’

    关于npm ERR! **@**dev: `webpack-dev-server --inline --progress --config‘ 原因:这是新版webpack存在的BUG,卸载现有的新版本 ...

  2. UVA12888 【Count LCM】(莫比乌斯反演)

    题意:求\(\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)==1]\) \(assume\ n<m\) \(\sum_{i=1}^{n}\sum_{j=1}^{m}[ ...

  3. Java代码审计连载之—添油加醋

    在代码审计中,按业务流程审计当然是必须的,人工的流程审计的优点是能够更加全面的发现漏洞,但是缺点是查找漏洞效率低下.如果要定向的查找漏洞,逆向跟踪变量技术就显得更加突出,如查找XSS.SQL注入.命令 ...

  4. git add .添加不成功

    情景: 我首先在一个有许多文件的文件夹中  git init  创建一个git管理仓库 之后 git add . 之后 git commit -m "提交" 发现提交不成功,文件没 ...

  5. zabbix 监控安装

    注意:此篇是在安装好lnmp环境后才能部署的操作,所以,做之前准备好lnmp环境,或者可以参考我做的lnmp环境,之后接着此篇开始安装 监控系统Zabbix-3.2.1的安装 zabbix-serve ...

  6. JAVA实现QRCode的二维码生成以及打印

    喜欢的朋友可以关注下,粉丝也缺. 不说废话了直接上代码 注意使用QRCode是需要zxing的核心jar包,这里给大家提供下载地址 https://download.csdn.net/download ...

  7. shopify网站转化率优化之结账页checkout优化

    昨天分享了“利用GOOGLE地图API实现shopify结账页checkout地址自动填写地址字段”是个非常屌的功能,但shopify默认的结账页checkout是这样的如图 [caption id= ...

  8. 利用django-simple-captcha生成验证码

    参考文档 http://django-simple-captcha.readthedocs.io/en/latest/ django支持1.7+ 1.安装 pip install django-sim ...

  9. JS常用工具函数(持续记录)

    1.设置获取cookie //方式1 //设置cookie function SetCookie(name, value)//两个参数,一个是cookie的名字,一个是值 { var Days = 3 ...

  10. xamarin自定义 application 无法调试

    我们在默认使用application 的时候发现 调试会爆异常 [application] public class DemoApplication:Application { } 根本原因是构造器 ...