Java中双冒号::的实现示例

 更新时间:2026年01月13日 09:31:03   作者:ZNineSun  
本文介绍JDK8新特性双冒号::,它是Java中的方法引用,也是Lambda表达式写法之一,能简化Java开发冗余代码,下面还阐述了其6种使用场景,感兴趣的可以了解一下

今天给大家分享一个JDK8中的新特性双冒号:”::“,双冒号“::”就是 Java 中的方法引用,是Java 8中的Lambda表达式写法之一,一种执行方法的方法。
在一定程度上简化了我们Java开发的冗余代码。

双冒号(::)使用场景一般有如下6种:

类型引用语法案例
引用静态方法类名::静态方法名Integer::parseInt
引用特定对象实例方法对象::静态方法名System.out::println
引用特定类型的任意对象的实例方法特定类型::实例方法名String::compareToIgnoreCase
引用超类(父类)的实例方法supre::方法名supre::fun
引用类构造方法类名::newArrayList::new
引用数组构造方法数组类型[]::newString[]::new

上面的内容太过于官方,下面我们简单看两个小例子:

1. Lambda表达式表达式:
person -> person.getName();
可以替换成:
Person::getName

2. Lambda表达式表达式:
() -> new HashMap<>();
可以替换成:
HashMap::new

在实际的开发中,我们可能还会遇到很多使用双冒号调用方法的操作

public class Test07 {
    public static void a(){
        System.out.printf("a1");
    }
    public static void a(String s){
        System.out.printf(s);
    }
    public static void main(String[] args) {
        Runnable runnable=Test07::a;
        runnable.run();
    }
}

这个时候大家能看出调用的是一个a方法吗,我们直接运行一下看一下结果:

说明Runnable对应的是无参的方法a,这是为什么呢?

原因就在于Runnable,追踪到它的原码不难发现它是一个函数式的接口

里面只有一个无参的run方法,这个方法对应到Runnable runnable=Test07::a就是无参的方法a
如果我们想要使用有参的方法a,那么该使用什么呢?

public class Test07 {
    public static void a() {
        System.out.printf("a1");
    }

    public static void a(String s) {
        System.out.printf(s);
    }

    public static void main(String[] args) {
        Consumer<String> consumer=Test07::a;
        consumer.accept("调用有参的方法a");
    }
}

通过其源码也可以发现,Consumer也是一个函数式接口,里面提供了一个有参的accept方法,这个方法对应到Test07::a就是有参的方法a,执行之后,可以看到结果如下:

看到这儿大家应该对什么是方法引用有了一些认知,其本质就是Runnable或Consumer来指向一个具体的方法,至于该使用哪一个就要看指向的方法是否有参数

可能有人就会有疑虑,因为我们Consumer的accept只能接收一个方法,那么所引用的方法也就只能对应一个参数,如果是多个参数怎么办,像下面的方法:

    public static void a(String s1,String s2) {
        System.out.printf(s1+s2);
    }

JDK内置了很多默认的函数式接口,比如BiConsumer

    public static void main(String[] args) {
        BiConsumer<String,String> biConsumer=Test07::a;
        biConsumer.accept("测试","数据");
    }

可以看到它可以接收两个参数,如果参数大于等于两个,建议将参数封装为一个对象,通过对象去传参

上面的内容均是无返回结果的,因为不管是Runnable的run方法还是Consumer的accept方法,均无返回值,如果我们需要返回值则可以使用Callable

通过源码不难发现Callable也是一个函数式接口,里面提供了一个无参的call方法,并且提供了返回值

public class Test07 {
    public static String b(){
        return "b";
    }
    public static void main(String[] args) throws Exception {
        Callable<String> runnable=Test07::b;
        String s=runnable.call();
        System.out.printf(s);
    }
}

到此这篇关于Java中双冒号::的实现示例的文章就介绍到这了,更多相关Java 双冒号::内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot自定义配置项过程

    SpringBoot自定义配置项过程

    在SpringBoot项目中,通过在application.properties文件中添加配置项,然后使用@ConfigurationProperties注解将这些配置项与实体Bean进行绑定,可以实现配置项与实体类字段的自动关联,进而方便地读取配置文件中的数据,这种方法不仅简化了配置管理
    2024-11-11
  • 关于ireport中传入list的处理方式

    关于ireport中传入list的处理方式

    这篇文章主要介绍了关于ireport中传入list的处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 深入探究Java线程不安全的原因与解决

    深入探究Java线程不安全的原因与解决

    线程不安全这个问题,一般在学Java时,我们老师会让我们背诵一段长长的话。"当不同线程同时能访问同一个变量时,可能会导致线程不安全"。实际上,这句话重点想突出的只有原子性。而我们往往考虑线程不安全的原因,会从三方面进行考虑:就是原子性,可见性,有序性
    2022-04-04
  • 详解Java类加载器与双亲委派机制

    详解Java类加载器与双亲委派机制

    这篇文章主要为大家介绍一下Java中的类加载器与双亲委派机制,文中通过示例为大家进行了详细的介绍,对我们学习Java有一定帮助,需要的可以参考一下
    2022-08-08
  • Java 中HttpURLConnection附件上传的实例详解

    Java 中HttpURLConnection附件上传的实例详解

    这篇文章主要介绍了Java 中HttpURLConnection附件上传的实例详解的相关资料,希望通过本文大家能掌握这样的知识内容,需要的朋友可以参考下
    2017-09-09
  • java返回json请求中文变成问号的问题及解决

    java返回json请求中文变成问号的问题及解决

    这篇文章主要介绍了java返回json请求中文变成问号的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 解决javac不是内部或外部命令,也不是可运行程序的报错问题

    解决javac不是内部或外部命令,也不是可运行程序的报错问题

    在学着使用Java的命令行来编译java文件的时候,遇到了这个问题,本文主要介绍了解决javac不是内部或外部命令,也不是可运行程序的报错问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • 使用JSON.toJSONString格式化成json字符串时保留null属性

    使用JSON.toJSONString格式化成json字符串时保留null属性

    这篇文章主要介绍了使用JSON.toJSONString格式化成json字符串时保留null属性,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Spring Cloud应用实现配置自动刷新过程详解

    Spring Cloud应用实现配置自动刷新过程详解

    这篇文章主要介绍了Spring Cloud应用实现配置自动刷新过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java数组声明、创建、初始化基础

    Java数组声明、创建、初始化基础

    本文讲述了Java数组的几个相关的方面,讲述了对Java数组的声明、创建和初始化,并给出其对应的代码
    2012-12-12

最新评论