蓝色追风鸟 發表於 2026-1-13 09:31:03

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

<p>今天给大家分享一个JDK8中的新特性双冒号:&rdquo;::&ldquo;,双冒号&ldquo;::&rdquo;就是 Java 中的方法引用,是Java 8中的Lambda表达式写法之一,一种执行方法的方法。<br />在一定程度上简化了我们Java开发的冗余代码。</p>
<p>双冒号(::)使用场景一般有如下6种:</p>
<table><thead><tr><th>类型</th><th>引用语法</th><th>案例</th></tr></thead><tbody><tr><td>引用静态方法</td><td>类名::静态方法名</td><td>Integer::parseInt</td></tr><tr><td>引用特定对象实例方法</td><td>对象::静态方法名</td><td>System.out::println</td></tr><tr><td>引用特定类型的任意对象的实例方法</td><td>特定类型::实例方法名</td><td>String::compareToIgnoreCase</td></tr><tr><td>引用超类(父类)的实例方法</td><td>supre::方法名</td><td>supre::fun</td></tr><tr><td>引用类构造方法</td><td>类名::new</td><td>ArrayList::new</td></tr><tr><td>引用数组构造方法</td><td>数组类型[]::new</td><td>String[]::new</td></tr></tbody></table>
<p>上面的内容太过于官方,下面我们简单看两个小例子:</p>
<div class="jb51code"><pre class="brush:java;">1. Lambda表达式表达式:
person -&gt; person.getName();
可以替换成:
Person::getName

2. Lambda表达式表达式:
() -&gt; new HashMap&lt;&gt;();
可以替换成:
HashMap::new
</pre></div>
<p>在实际的开发中,我们可能还会遇到很多使用双冒号调用方法的操作</p>
<div class="jb51code"><pre class="brush:java;">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();
    }
}
</pre></div>
<p>这个时候大家能看出调用的是一个a方法吗,我们直接运行一下看一下结果:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026011309312348.png" /></p>
<p>说明Runnable对应的是无参的方法a,这是为什么呢?</p>
<p>原因就在于Runnable,追踪到它的原码不难发现它是一个函数式的接口</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026011309312316.png" /></p>
<p>里面只有一个无参的run方法,这个方法对应到Runnable runnable=Test07::a就是无参的方法a<br />如果我们想要使用有参的方法a,那么该使用什么呢?</p>
<div class="jb51code"><pre class="brush:java;">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&lt;String&gt; consumer=Test07::a;
      consumer.accept("调用有参的方法a");
    }
}
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026011309312390.png" /></p>
<p>通过其源码也可以发现,Consumer也是一个函数式接口,里面提供了一个有参的accept方法,这个方法对应到<strong><span style="color:#e36c09">Test07::a</span></strong>就是有参的方法a,执行之后,可以看到结果如下:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026011309312387.png" /></p>
<p>看到这儿大家应该对什么是方法引用有了一些认知,其本质就是Runnable或Consumer来指向一个具体的方法,至于该使用哪一个就要看指向的方法是否有参数</p>
<p>可能有人就会有疑虑,因为我们Consumer的accept只能接收一个方法,那么所引用的方法也就只能对应一个参数,如果是多个参数怎么办,像下面的方法:</p>
<div class="jb51code"><pre class="brush:java;">    public static void a(String s1,String s2) {
      System.out.printf(s1+s2);
    }
</pre></div>
<p>JDK内置了很多默认的函数式接口,比如<strong><span style="color:#e36c09">BiConsumer</span></strong></p>
<div class="jb51code"><pre class="brush:java;">    public static void main(String[] args) {
      BiConsumer&lt;String,String&gt; biConsumer=Test07::a;
      biConsumer.accept("测试","数据");
    }
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026011309312392.png" /></p>
<p>可以看到它可以接收两个参数,如果参数大于等于两个,建议将参数封装为一个对象,通过对象去传参</p>
<p>上面的内容均是无返回结果的,因为不管是Runnable的run方法还是Consumer的accept方法,均无返回值,如果我们需要返回值则可以使用Callable</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026011309312376.png" /></p>
<p>通过源码不难发现Callable也是一个函数式接口,里面提供了一个无参的call方法,并且提供了返回值</p>
<div class="jb51code"><pre class="brush:java;">public class Test07 {
    public static String b(){
      return "b";
    }
    public static void main(String[] args) throws Exception {
      Callable&lt;String&gt; runnable=Test07::b;
      String s=runnable.call();
      System.out.printf(s);
    }
}
</pre></div>
<p>到此这篇关于Java中双冒号::的实现示例的文章就介绍到这了,更多相关Java 双冒号::内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>Java中双冒号运算符(::)的用法详解</li><li>Java中双冒号(::)运算操作符用法详解</li><li>Java中双冒号::的作用举例详解</li><li>Java双冒号(::)运算符使用详解</li><li>深入理解Java8双冒号::的使用</li><li>java lambda 表达式中的双冒号的用法说明 ::</li><li>浅谈对Java双冒号::的理解</li><li>java8中:: 用法示例(JDK8双冒号用法)</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Java中双冒号::的实现示例