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

范式:

类名::方法名

注意:

  1. 方法后面并没有()
  2. 懒加载方法是否调用要看调用方使用情况

使用范例

方法调用

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/

原文地址:https://www.cnblogs.com/yanlong300/p/9209243.html

时间: 2024-10-11 23:07:02

java :: Java中的双冒号操作符的相关文章

C++中的双冒号作用

1. 作用域符号::的前面一般是类名称,后面一般是该类的成员名称,C++为例避免不同的类有名称相同的成员而采用作用域的方式进行区分 如:A,B表示两个类,在A,B中都有成员member.那么 A::member就表示类A中的成员member B::member就表示类B中的成员member 2. 全局作用域符号: 例如: #include <stdio.h> int count = 0; //全局变量 0 void main() { int count = 10; //局部变量10 print

“::before”和“:before”中的双冒号和单冒号的区别

伪类 伪元素 css3 为了区分伪类和伪元素两者,已经明确规定了伪类用一个冒号来表示,而伪元素则用两个冒号来表示.对于CSS2之前已有的伪元素,比如:before,单冒号和双冒号的写法::before作用是一样的. 你的网站只需要兼容webkit.firefox.opera等浏览器,建议对于伪元素采用双冒号的写法,如果不得不兼容IE浏览器,还是用CSS2的单冒号写法比较安全.如果自己不确定的话可以针对某些需要兼容的属性有两种属性 原文地址:https://www.cnblogs.com/yogi

java 8 中lambda表达式学习

转自 http://blog.csdn.net/renfufei/article/details/24600507 http://www.jdon.com/idea/java/10-example-of-lambda-expressions-in-java8.html Lambda表达式的语法基本语法:(parameters) -> expression或(parameters) ->{ statements; } 下面是Java lambda表达式的简单例子: // 1. 不需要参数,返回值

php中双冒号::的用法

注:本篇博客系转载,出处不可考(至少对我来说不可考...) 双冒号操作符即作用域限定操作符Scope Resolution Operator可以访问静态.const和类中重写的属性与方法. 在类定义外使用的话,使用类名调用.在PHP 5.3.0,可以使用变量代替类名. Program List:用变量在类定义外部访问 <?php class Fruit { const CONST_VALUE = 'Fruit Color'; } $classname = 'Fruit'; echo $class

解决Hibernate不支持PostgreSQL中双冒号(::)的Bug

在PostgreSQL中,双冒号(::)的作用是类型转换,而在Hibernate中,SQL中冒号的作用是命名参数,用于SQL中命名参数的匹配,这时,当在PostgreSQL数据库环境中,正常的SQL本身包括双冒号时,通过Hibernate进行查询就会报错,这个应该是Hibernate的一个Bug,怎么解决呢,本文将给出方案. 通过研究Hibernate的源代码,发现了问题所在,问题出在org.hibernate.engine.query.spi.ParameterParser,这个类构造方法为私

Makefile 双冒号规则

双冒号规则就是使用"::"代替普通规则的":"得到的规则.当同一个文件作为多个规则的目标时,双冒号规则的处理和普通规则的处理过程完全不同(双冒号规则允许在多个规则中为同一个目标指定不同的重建目标的命令).首先需要明确的是:Makefile 中,一个目标可以出现在多个规则中.但是这些规则必须是同一类型的规则,要么都是普通规则,要么都是双冒号规则.而不允许一个目标同时出现在两种不同类型的规则中.双冒号规则和普通规则的处理的不同点表现在以下几个方面:1. 双冒号规则中,当

理解 Java 方法引用(方法引用符:“双冒号 :: ”)

方法引用 在使用Lambda表达式的时候,我们实际上传递进去的代码就是一种解决方案:拿什么参数做什么操作.那么考虑一种情况:如果我们在Lambda中所指定的操作方案,已经有地方存在相同方案,那是否还有必要再写重复逻辑? 冗余的Lambda场景 来看一个简单的函数式接口以应用Lambda表达式: @FunctionalInterface public interface Printable { /** * 接收一个字符串参数,打印显示它 * @param str 字符串 */ public abs

Java中的自增操作符与中间缓存变量机制

转自:http://blog.csdn.net/maggiedorami/article/details/7986098 我们来看这样一段程序: public static void main(String[] args){ int i, sum1, sum2; i=0; sum1 = (i++)+(i++); System.out.println("sum1="+sum1); i = 0; sum2 = (++i)+(++i); System.out.println("su

lambda表达式,java双冒号(::)示例详解

双冒号(::)主要使用形式包括: 类名::实例方法 对象::实例方法 下面通过代码示例,详细解说. 双冒号(::)和 箭头函数(->)一并展示如下: 如:HashMap::new  等同于  ( ) -> new HashMap() 1 public class Test { 2 3 // 实例对象引用实例方法 4 Supplier<String> supplier1 = "lowerCase"::toUpperCase; 5 Supplier<Strin