英文:double colon,双冒号(::)运算符在Java 8中被用作方法引用(method reference),方法引用是与lambda表达式相关的一个重要特性。它提供了一种不执行方法的方法。为此,方法引用需要由兼容的函数接口组成的目标类型上下文。

Method References

You use lambda expressions to create anonymous methods. Sometimes, however, a lambda expression does nothing but call an existing method. In those cases, it’s often clearer to refer to the existing method by name. Method references enable you to do this; they are compact, easy-to-read lambda expressions for methods that already have a name.

参考oracle官网

您使用lambda表达式来创建匿名方法。然而,有时lambda表达式除了调用现有方法外什么也不做。在这些情况下,通过名称引用现有方法通常更清楚。方法引用使您能够做到这一点;它们是紧凑的、易于阅读的lambda表达式,用于已经有名称的方法。

以下是Java 8中方法引用的一些语法:

静态方法引用(static method)语法:classname::methodname 例如:User::getAge

对象的实例方法引用语法:instancename::methodname 例如:System.out::println

对象的超类方法引用语法: super::methodname

类构造器引用语法: classname::new 例如:ArrayList::new

数组构造器引用语法: typename[]::new 例如: String[]:new

现有一个类 Something

class Something {

// constructor methods

Something() {}

Something(String something) {

System.out.println(something);

}

// static methods

static String startsWith(String s) {

return String.valueOf(s.charAt(0));

}

// object methods

String endWith(String s) {

return String.valueOf(s.charAt(s.length()-1));

}

void endWith() {}

}

如何用 '::' 来访问类Something中的方法呢?先定义一个接口,因为必须要用 functional interface 来接收,否则编译错误(The target type of this expression must be a functional interface)

@FunctionalInterface

interface IConvert {

T convert(F form);

}

(@FunctionalInterface 注解要求接口有且只有一个抽象方法,JDK中有许多类用到该注解,比如 Runnable,它只有一个 Run 方法。)

观察接口 IConvert,传参为类型 F,返回类型 T。所以,我们可以这样访问类Something的方法:

访问静态方法

// static methods

IConvert convert = Something::startsWith;

String converted = convert.convert("123");

访问对象方法

// object methods

Something something = new Something();

IConvert converter = something::endWith;

String converted = converter.convert("Java");

访问构造方法

// constructor methods

IConvert convert = Something::new;

Something something = convert.convert("constructors");

总结:我们可以把类Something中的方法static String startsWith(String s){...}、String endWith(String s){...}、Something(String something){...}看作是接口IConvert的实现,因为它们都符合接口定义的那个“模版”,有传参类型F以及返回值类型T。比如构造方法Something(String something),它传参为String类型,返回值类型为Something。注解@FunctionalInterface保证了接口有且仅有一个抽象方法,所以JDK能准确地匹配到相应方法。

hashdog

发布了62 篇原创文章 · 获赞 23 · 访问量 1万+

私信

关注

标签:convert,冒号,Java,String,Something,使用,lambda,方法,methods

来源: https://blog.csdn.net/corleone_4ever/article/details/104182042

java 双冒号_Java :: 双冒号使用相关推荐

  1. java中的双与_java 双冒号是什么操作符?

    双冒号::在JDK8的Lambda表达式函数中开始使用,用作方法引用. 具体用法,咱们来举个例子: 假设有个Person类: public class Person { public enum Sex ...

  2. java 正则表达式匹配冒号_java 获取冒号后面的参数(正则)实现代码

    我就废话不多说了,大家还是直接看代码吧~ String regEx=":[\S]+"; String sql=" select * from a where id=:id ...

  3. java括号用法_Java双括弧使用技巧

    Java双括弧技巧回顾 初看cgaolei翻译的Java技巧之双括弧初始化一文,走马观花,只知用法,未细看后面的解释.蔚为惊艳,心里想Java竟然有这么神奇的语法而一直未得知.因为在初始化集合时确实方 ...

  4. java图片双缓存_Java 双缓冲技术消除图片闪动

    一般在使用Canvas组件刷新显示图片或者绘图的时候,会产生闪烁.这是由于机制是先使用背景色对原有内容进行覆盖,再往上面绘制新内容所引起的.我们看到的闪烁就是背景色和新内容之间的交替显示. 下面为Ca ...

  5. html中两个冒号,css中双冒号和单冒号区别

    :--是指的伪类 ::--是指的伪元素 1.字面意思: 伪类,1.css中有类选择器,某些元素并未定义类名,就可以通过伪类赋予样式,如:[:nth-child(n)]:2.伪类可以应用于元素执行某种状 ...

  6. [css] ::before和:after中单冒号和双冒号的区别是什么,这两个伪元素有什么作用?

    [css] ::before和:after中单冒号和双冒号的区别是什么,这两个伪元素有什么作用? 区别:伪元素在css1中已经存在当时用单冒号,css3时做了修订用双冒号 ::before ::aft ...

  7. html语言中的双冒号,css单冒号和双冒号用法和区别

    最近突然被别人问起css单冒号和双冒号有什么区别,答曰:"不知道". 虽然还在填坑中,但作为一个跨过了初级的FEer,感觉着实汗颜,刚好今天下午在搜别的问题的时候,突然看到一个对比 ...

  8. C++ 单冒号: 和双冒号:: 的作用

    刚开始看C++入门经典这本书,可能是C语言不过关吧,很多运算符跟关键字都理解不了,鄙人百度了好多文章,觉得以下是总结的比较好的 原文地址:http://www.360doc.com/content/1 ...

  9. html语言中的双冒号,::before 和:after 中双冒号和单冒号有什么区别?解释一下这 2 个伪元素的作用...

    标题:::before 和:after 中双冒号和单冒号有什么区别?解释一下这 2 个伪元素的作用? 相关知识点: 单冒号(:)用于CSS3伪类,双冒号(::)用于CSS3伪元素.(伪元素由双冒号和伪 ...

最新文章

  1. 通配符?子字符串匹配主字符串次数_突破LeetCode,拿BAT大厂offer之《正则表达式匹配》(动态规划)...
  2. c实现的trim函数
  3. css知多少(1)——我来问你来答(转)
  4. java 装饰器模式
  5. UML工具:EA(Enterprise Architect)
  6. 无码系列-3-代码架构约束
  7. 《恋上数据结构第1季》二叉搜索树BST
  8. Qt Model/View/Delegate浅谈 - QAbstractListModel
  9. java程序包r不存在_java - 从命令行使用Gradle构建时,“程序包R不存在”错误 - 堆栈内存溢出...
  10. 如何让Vue在同一局域网内能访问?
  11. esayUI实践的一些体会
  12. 思科与华为常用交换机产品线介绍
  13. 记一篇IT培训日记050-嗯嗯,差距不大
  14. html 粘贴 word文档,Word2019文档中粘贴文本的两种方式
  15. WinForm自定义分页控件实现Datagridview分页效果附引用Demo
  16. 云端3d虚拟现实展制作
  17. 用pyecharts画地图(世界地图、中国省级地图、市级地图、某省市级地图、某市县级地图)
  18. 服务器可视化显示空间,云服务器可视化面板
  19. actin/phobos后缀勒索病毒处理 百分百解密[cleverhorse@protonmail.
  20. 影响 Redis 性能的 5 大方面的潜在因素

热门文章

  1. 20考研数一137分考研数学经验分享
  2. c++三种排序学习图文笔记(冒泡,插入,快速)
  3. linux kernel2.6中软中断运行线程ksoftirqd的创建
  4. PHP将PDF转图片-实战
  5. 20.番外篇——Vue如何自定义组件并且进行全局配置
  6. MATLAB-plot绘图函数
  7. 计算机信息计量单位G的单位,计算机中的有些计量单位例如G、MB是表示什么意思?...
  8. Loongson_2F/ 3A【tftp+u盘】方式安装系统(开机不认u盘)
  9. Leetcode 881:救生艇问题
  10. 很有哲理的句子,每天都值得看一遍