日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Java中::這個(gè)符號(hào)是干嘛的

1. 前言

Java中的方法引用,很多同學(xué)都見(jiàn)過(guò)但卻叫不出名字,在這篇文章中,我們將看到什么是方法引用以及如何使用它。

成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)服務(wù)團(tuán)隊(duì)是一支充滿(mǎn)著熱情的團(tuán)隊(duì),執(zhí)著、敏銳、追求更好,是創(chuàng)新互聯(lián)的標(biāo)準(zhǔn)與要求,同時(shí)竭誠(chéng)為客戶(hù)提供服務(wù)是我們的理念。創(chuàng)新互聯(lián)建站把每個(gè)網(wǎng)站當(dāng)做一個(gè)產(chǎn)品來(lái)開(kāi)發(fā),精雕細(xì)琢,追求一名工匠心中的細(xì)致,我們更用心!

2. 方法引用的使用場(chǎng)景

我們先來(lái)看看方法引用的使用:

 
 
 
 
  1. new Random().ints(10) 
  2.         .map(i->Math.abs(i)) 
  3.         .forEach(i -> System.out.println(i));  

這里我們隨機(jī)生成10個(gè)整數(shù)然后取它們絕對(duì)值并一一打印出來(lái)。寫(xiě)法是沒(méi)有問(wèn)題的,但是還是可以再簡(jiǎn)化的。

map方法接受的是一個(gè)函數(shù)式接口IntUnaryOperator,那么上面代碼中的i->Math.abs(i)實(shí)際上是:

 
 
 
 
  1. new IntUnaryOperator() { 
  2.     @Override 
  3.     public int applyAsInt(int operand) { 
  4.         return Math.abs(operand); 
  5.     } }  

從上面來(lái)看IntUnaryOperator就是代理了Math.abs(int i),參數(shù)列表、返回值都相同,而且沒(méi)有摻雜其它額外的邏輯。這一點(diǎn)非常重要,不摻雜其它邏輯才能相互代替。那么就可以通過(guò)方法引用來(lái)簡(jiǎn)化Lambda 表達(dá)式。上面的式子就可以簡(jiǎn)化為:

 
 
 
 
  1. new Random().ints(10) 
  2.          .map(Math::abs) 
  3.          .forEach(System.out::println);  

3. 方法引用

Java 方法引用Java 8隨著Lambda表達(dá)式引入的新特性。 可以直接引用已有Java類(lèi)或?qū)ο蟮姆椒ɑ驑?gòu)造器。方法引用通常與Lambda表達(dá)式結(jié)合使用以簡(jiǎn)化代碼。其使用條件是:Lambda表達(dá)式的主體僅包含一個(gè)表達(dá)式,且Lambda表達(dá)式只調(diào)用了一個(gè)已經(jīng)存在的方法;被引用的方法的參數(shù)列表和返回值與Lambda表達(dá)式的輸入輸出一致

3.1 格式

方法引用的格式為::。也就是被引用的方法所屬的類(lèi)名和方法名用雙冒號(hào)::隔開(kāi),構(gòu)造器方法是個(gè)例外,引用會(huì)用到new關(guān)鍵字,總結(jié)了一下:

引用方式說(shuō)明靜態(tài)方法引用ClassName :: staticMethodName 例如上面的Math::abs構(gòu)造器引用ClassName :: new 例如通過(guò)Supplier 返回新實(shí)例類(lèi)任意實(shí)例方法引用ClassName :: instanceMethodName 例如 String::concat類(lèi)特定實(shí)例方法引用instance:: instanceMethodName 例如 this::equals

4. 關(guān)于可讀性問(wèn)題

大部分人認(rèn)為Lambda 表達(dá)式存在閱讀困難的問(wèn)題,其實(shí)不然,這種流水線(xiàn)的結(jié)構(gòu)恰恰增加了可讀性,每一個(gè)Lambda 表達(dá)式都可以看作一個(gè)執(zhí)行策略,方法引用反而讓你能更加清楚執(zhí)行了什么策略。另外我經(jīng)常見(jiàn)到類(lèi)似如下的流式寫(xiě)法: 

 
 
 
 
  1. new Random().ints(10) 
  2.          .map(operand -> { 
  3.              System.out.println("operand = " + operand); 
  4.              return operand+1; 
  5.          })         .forEach(System.out::println); 

這種"大肚子"寫(xiě)法的風(fēng)格是不建議在函數(shù)式編程中出現(xiàn)的。最好單獨(dú)提出來(lái)封裝做方法引用,寫(xiě)成下面的風(fēng)格: 

 
 
 
 
  1. public void randomInt() { 
  2.      new Random().ints(10) 
  3.              .map(this::selfIncreasing) 
  4.              .forEach(System.out::println); 
  5.   } ? // 封裝 
  6.  private int selfIncreasing(int self){ 
  7.      System.out.println("self = " + self); 
  8.      return self+1; 
  9.  } 

這樣反而可讀性很強(qiáng),隨機(jī)取10個(gè)數(shù),然后每個(gè)數(shù)走個(gè)自增并分別打印出來(lái)。

5. 總結(jié)

方法引用實(shí)現(xiàn)在特定場(chǎng)景下Lambda表達(dá)式的簡(jiǎn)化表示,目的在于讓代碼更加簡(jiǎn)潔。但是習(xí)慣了傳統(tǒng)Java編程風(fēng)格的同學(xué)上來(lái)會(huì)不太適應(yīng),希望借助于本文能幫助你解決這個(gè)問(wèn)題。


分享標(biāo)題:Java中::這個(gè)符號(hào)是干嘛的
標(biāo)題URL:http://www.5511xx.com/article/cdeipsg.html