Java 中的双冒号“::”
Posted JFS_Study
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 中的双冒号“::”相关的知识,希望对你有一定的参考价值。
一、双冒号“::”就是 Java 中的方法引用(Method references)
方法引用的格式是类名::方法名
。一般是用作 Lambda表达式。
形如 ClassName::methodName 或者 objectName::methodName 的表达式,叫做方法引用(Method Reference)。看看编译器是如何根据 “晦涩难懂” 的 Method Reference 来推断开发者的意图的。例如:
1.表达式:
person -> person.getName();
可以替换成:
Person::getName
2.表达式:
() -> new HashMap<>();
可以替换成:
HashMap::new
二、四种方法引用
1️⃣指向静态方法的引用
2️⃣指向某个对象的实例方法的引用
3️⃣指向某个类型的实例方法的引用
4️⃣指向构造方法的引用
三、总结
其实,JVM 本身并不支持指向方法引用,过去不支持,现在也不支持。Java 8 对方法引用的支持只是编译器层面的支持,虚拟机执行引擎并不了解方法引用。编译器遇到方法引用的时候,会像上面那样自动推断出开发者的意图,将方法引用还原成接口实现对象,或者更形象地说,就是把方法引用设法包装成一个接口实现对象,这样虚拟机就可以无差别地执行字节码文件而不需要管什么是方法引用了。
需要注意的是,方法引用是用来简化接口实现代码的,并且凡是能够用方法引用来简化的接口,都有这样的特征:有且只有一个待实现的方法。这种接口在 Java 中有个专门的名称: 函数式接口。当试图用方法引用替代一个非函数式接口时,会有这样的错误提示: xxx is not a functional interface。
java :: Java中的双冒号操作符
java中的双冒号操作符
定义
双冒号运算操作符是类方法的句柄,lambda表达式的一种简写,这种简写的学名叫eta-conversion或者叫η-conversion。
通常的情况下:
把 x -> System.out.println(x) 简化为 System.out::println 的过程称之为 eta-conversion
把 System.out::println 简化为 x -> System.out.println(x) 的过程称之为 eta-expansion
范式:
类名::方法名
注意:
- 方法后面并没有()
- 懒加载方法是否调用要看调用方使用情况
使用范例
方法调用
person -> person.getAge();
可以替换成
Person::getAge
x -> System.out.println(x)
可以替换成
System.out::println
out是一个PrintStream类的对象,println是该类的方法,依据x的类型来重载方法
创建对象
() -> new ArrayList<>();
可以替换为
ArrayList::new
new关键字实际上调用的是ArrayList的构造方法
JVM实现
JVM底层实现是CallSite,对JDK层暴漏的接口是Functional
引用
http://hongjiang.info/eta-conversion-and-eta-expansion/
以上是关于Java 中的双冒号“::”的主要内容,如果未能解决你的问题,请参考以下文章
『C/C++养成计划』C++中的双冒号::名解析(Scope Resolution Operator)