JDK8中有双冒号的用法,形如Class::methodname,符号左边是调用方法所处的类名,符号右边是调用的静态方法。简单的说,就是逐一传入参数值到某个类的静态方法并调用该静态方法。

以前的方式

public static void  printValue(String str){System.out.println("print value : "+str);
}
public static void main(String[] args) {List<String> list = Arrays.asList("a","b","c","d");for (String a: list) {Test.printValue(a);}System.out.println("===============================");//下面的for each循环和上面的循环是等价的list.forEach(s->{Test.printValue(s);});
}
print value : a
print value : b
print value : c
print value : d
===============================
print value : a
print value : b
print value : c
print value : d

现在使用双冒号的方式

public static void print(String str) {System.out.println("print vlistue : " + str);
}
public static void main(String[] args) {List<String> list = Arrays.asList("a", "b", "c", "d");list.forEach(Test::print);//遍历集合的元素,并逐一传入调用的静态方法中,实现各元素的打印System.out.println("=======================================");//下面的方法和上面的方法是等价的Consumer<String> methodParam = Test::print; //定位到调用方法的参数位置list.forEach(s -> methodParam.accept(s));//遍历传送元素-定位处逐一接收传送过来的各元素,并打印
}
print vlistue : a
print vlistue : b
print vlistue : c
print vlistue : d
=======================================
print vlistue : a
print vlistue : b
print vlistue : c
print vlistue : d

有的时候,我们还会看到Object::的用法

其实用法也差不多,只不过Class::function的形式中function是属于Class的,可以是静态方法也可以是非静态方法。而Object::的形式中funtion是属于这个对象的,可以是静态方法也可以是非静态方法。Object::中比较特殊的代表就是this::的用法了,指向当前对象。

下面,来看看几种用法示例。

1)System.out::println

public static void main(String[] args) {String[] array = {"aa", "xx", "ss"};List<String> list = Arrays.asList(array);//Java 7for(String s:list){System.out.println(s);}//Java 8list.forEach(System.out::println);
}

说明:System.out是一个对象,而且是一个PrintStream类型的实例。println是PrintStream类中的一个非静态方法。

System.out.println()的真正含义

out是System类中的一个静态属性,默认值为null,类型为PrintStream。System.out的实例化是通过System类中的initializeSystemClass方法完成的,在虚拟机加载的时候完成初始化。

2)instance::print

public class Test {public static void main(String[] args) {List<String> list = Arrays.asList("aa", "xx", "ss");//形如 instanceRef::methodNamelist.forEach(new Demo()::print);}
}
class Demo{public void print(String content){System.out.println(content);//aa xx ss}
}

3)super::print

public class Test extends Demo{public void invokePrint(){List<String> list = Arrays.asList("aa", "xx", "ss");//形如 instanceRef::methodNamelist.forEach(super::print);}public static void main(String[] args) {new Test().invokePrint();}
}
class Demo{public void print(String content){System.out.println(content);//aa xx ss}
}

4)this::print

public class Test extends Demo{public void invokePrint(){List<String> list = Arrays.asList("aa", "xx", "ss");//形如 instanceRef::methodName
//        list.forEach(super::print);list.forEach(this::print);}@Overridepublic void print(String content){System.out.println("【子类-重写】"+content);}public static void main(String[] args) {new Test().invokePrint();}
}
class Demo{public void print(String content){System.out.println(content);}
}

5)类无参构造器语法-Class::new

public class Test {public void test() {InterfaceTest com =  Test::new;//这里并不是真正的实现,而是绑定new Test操作(关联)到接口方法Test bean = com.create();//调用create方法时才真正触发new Test()操作System.out.println(bean);}public static void main(String[] args) {new Test().test();}
}
interface InterfaceTest{Test create();
}

说明:通过idea的标记提示好像Test实现了InterfaceTest,但其实并没有真正实现InterfaceTest!

6)类有参构造器语法-Class::new

public class Test {private String name;Test(String name){this.name = name;}Test(){}public void test() {InterfaceTest com =  Test::new;//这里并不是真正的实现,而是绑定new Test操作(关联)到接口方法Test bean = com.create("hello world");//调用create方法时才真正触发new Test("hello world")操作System.out.println(bean);System.out.println(bean.name);}public static void main(String[] args) {new Test().test();}
}
interface InterfaceTest{Test create(String name);
}
Test@161cd475
hello world

7)数组构造器语法-Test[]::new

借用jdk自带的java.util.function.Function接口实现

public class Test {public static void main(String[] args) {Function<Integer, Test[]> function = Test[]::new;//关联操作到接口方法Test[] array = function.apply(3);//真正调用,创建大小为3的数组for (Test e : array) {System.out.println(e);//输出3个空对象(null)}}
}

使用自定义接口实现(需要使用@FunctionalInterface注解标记)

public class Test {public static void main(String[] args) {Interface <Integer, Test[]> function = Test[]::new;Test[] array = function.apply(3);for(Test e:array){System.out.println(e);}}
}
@FunctionalInterface
interface Interface<A, T>{T apply(A a);
}

8)ArrayList::new

可以这么操作

public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("alpha");list.add("beta");list = list.stream().map(s -> s.toUpperCase()).collect(Collectors.toList());System.out.println(list);//[ALPHA, BETA]
}

也可以这么操作

public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("alpha");list.add("beta");//String::toUpperCase表示String的非静态方法被各个元素调用list = list.stream().map(String::toUpperCase).collect(Collectors.toCollection(ArrayList::new));System.out.println(list);//[ALPHA, BETA]
}

还可以这么操作

public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("alpha");list.add("beta");//调用Strings的toUpperCase静态方法list = list.stream().map(Strings::toUpperCase).collect(Collectors.toCollection(ArrayList::new));System.out.println(list);//[ALPHA, BETA]
}

java 双冒号用法相关推荐

  1. java函数参数使用冒号_java8中:: 用法示例(JDK8双冒号用法)

    JDK8中有双冒号的用法,就是把方法当做参数传到stream内部,使stream的每个元素都传入到该方法里面执行一下. 代码其实很简单: 以前的代码一般是如此的: public class Accep ...

  2. JDK8 双冒号用法

    java8 :: 用法 (JDK8 双冒号用法) 特性 jdk8中使用了::的用法.就是把方法当做参数传到stream内部,使stream的每个元素都传入到该方法里面执行一下,双冒号运算就是Java中 ...

  3. java双冒号_jdk8新特性之双冒号 :: 用法及详解

    jdk8的新特性有很多,最亮眼的当属函数式编程的语法糖,本文主要讲解下双冒号::的用法. 概念 类名::方法名,相当于对这个方法闭包的引用,类似js中的一个function.比如: Function ...

  4. mysql 双冒号_jdk8新特性之双冒号 :: 用法及详解

    jdk8的新特性有很多,最亮眼的当属函数式编程的语法糖,本文主要讲解下双冒号::的用法. 概念 类名::方法名,相当于对这个方法闭包的引用,类似js中的一个function.比如: Function  ...

  5. java8 :: 用法 (JDK8 双冒号用法)

    JDK8中有双冒号的用法,就是把方法当做参数传到stream内部,使stream的每个元素都传入到该方法里面执行一下. 代码其实很简单: 以前的代码一般是如此的: public class Accep ...

  6. python列表截取双冒号“::“用法

    比如: my_list = list(range(0, 10)) 双冒号的用法是:列表[起始:终止:步长],默认是my_list[0:-1:1] 一个冒号-示例: my_list[1:2] # 等同于 ...

  7. java 双冒号_Java :: 双冒号使用

    英文:double colon,双冒号(::)运算符在Java 8中被用作方法引用(method reference),方法引用是与lambda表达式相关的一个重要特性.它提供了一种不执行方法的方法. ...

  8. lambda表达式双冒号使用条件_java_java基础_lambda表达式双冒号用法

    过于基础,就不废话了,实验代码如下: package com.demo; import java.util.Arrays; import java.util.List; import java.uti ...

  9. java8学习之双冒号用法

    用法说明 JDK8中有双冒号的用法,就是把方法当做参数传到stream内部,使stream的每个元素都传入到该方法里面执行一下. 类名::方法名 使用示例 person -> person.ge ...

最新文章

  1. make life colorful
  2. vs2013下oracle proc配置
  3. 2015年 第06届 蓝桥杯 Java B组 决赛真题详解及小结
  4. 东南亚版“QQ 音乐”:JOOX 的音乐推荐重构之路
  5. 重建二叉树(基于js)
  6. System.getProperty(user.dir); 获得系统属性
  7. “奔三”了,程序员,你该怎么选择未来的路?
  8. 1618D. Array and Operations
  9. php this 和 self,PHP中this和self的区别
  10. 计算机工程与应用3天外审,200629计算机工程与应用.pdf
  11. Autograd看这一篇就够了!
  12. 用tqdm可视化loop过程
  13. 如何从JQuery中的each()函数中断/退出? [重复]
  14. cmd for语句的用法
  15. android中简单视频播放器demo(附githup下载源码)
  16. 斗鱼 虎牙24 小时直播电影教程
  17. python断言语句_Python断言assert的用法代码解析
  18. 几种常用的传感器(加速度传感器、重力传感器、方向传感器、陀螺仪)简介
  19. word2016 脚注问题总结
  20. CTGU实验5_2-创建还书罚款触发器

热门文章

  1. 数据仓库系列(3):数据的价值如何体现
  2. 大数据使磁带重获新生
  3. 计算机发展史资料简介,计算机发展史简介
  4. PDF转Word怎么转?教你三招快速实现PDF转Word
  5. 联盟商家入驻三级分销商城系统开发app
  6. matlab计算矩阵的相关系数矩阵,计算二维矩阵的相关系数
  7. VirtualBox虚拟电脑控制台错误,不能为虚拟电脑打开一个新任务
  8. 读论文:Noise2Noise: Learning Image Restoration without Clean Data
  9. nginx服务器中url重写rewrite参数和例子
  10. stm32单片机实现多个闹钟_基于STM32F103系列单片机的11个定时器解析