成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java中::這個符號是干嘛的

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

[[344515]]

1. 前言

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

2. 方法引用的使用場景

我們先來看看方法引用的使用:

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

這里我們隨機(jī)生成10個整數(shù)然后取它們絕對值并一一打印出來。寫法是沒有問題的,但是還是可以再簡化的。

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

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

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

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

3. 方法引用

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

Java中::這個符號是干嘛的

 

Java中::這個符號是干嘛的

 

3.1 格式

方法引用的格式為<ClassName | instance>::<MethodName>。也就是被引用的方法所屬的類名和方法名用雙冒號::隔開,構(gòu)造器方法是個例外,引用會用到new關(guān)鍵字,總結(jié)了一下:

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

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

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

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

這種"大肚子"寫法的風(fēng)格是不建議在函數(shù)式編程中出現(xiàn)的。最好單獨(dú)提出來封裝做方法引用,寫成下面的風(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個數(shù),然后每個數(shù)走個自增并分別打印出來。

5. 總結(jié)

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

 

責(zé)任編輯:龐桂玉 來源: 今日頭條
相關(guān)推薦

2021-03-11 08:50:58

Spring容器接口

2023-09-21 07:24:52

2024-08-28 08:33:57

2018-07-10 10:48:00

IT程序員怪圈

2025-05-08 09:10:00

2022-01-19 11:19:25

Java/接口/代碼

2021-12-17 12:20:20

Java開發(fā)代碼

2021-08-10 09:28:10

ViteES Modules Dev Server

2023-02-13 11:26:03

符號鏈接Linux

2020-09-09 07:55:51

TS開源符號

2012-10-08 09:19:49

2012-11-05 09:31:29

新聞回顧

2019-12-04 09:18:40

HTTPS協(xié)議HTTP

2022-06-06 08:36:02

多租戶模式RabbitMQ

2017-11-17 09:13:31

Java注解

2017-03-20 19:18:00

Android符號引用

2021-10-18 13:42:52

加密貨幣金融工具

2019-05-13 08:51:53

總監(jiān)技術(shù)CTO

2019-05-06 10:51:49

總監(jiān)技術(shù)場景

2023-11-08 08:27:30

泛型Java
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久久999免费视频 999久久久久久久久6666 | www.97zyz.com | 台湾佬久久 | 免费成人高清在线视频 | 国产91在线 | 中日 | 99精品一区二区三区 | 国产精品一区一区 | 午夜男人免费视频 | 久久网站黄 | 亚洲精品9999| 国产亚洲精品综合一区 | 国产精品1区2区3区 一区中文字幕 | 国产精品日本一区二区不卡视频 | 日韩在线不卡 | 99精品欧美一区二区蜜桃免费 | 日韩精品免费 | 午夜av毛片| 99久久免费观看 | 久久久久久久久毛片 | 天天影视综合 | 在线播放中文字幕 | www.精品国产 | 国产精品日日摸夜夜添夜夜av | 免费黄色的视频 | 日韩精品成人网 | 亚洲国产精品久久人人爱 | 国产成人精品午夜 | 精品久久网 | 国产精品久久久久久吹潮 | 日本精品视频在线 | 亚洲成人一区 | h在线免费观看 | 日操操| 欧美极品在线 | 亚洲成人二区 | 国产成人亚洲精品自产在线 | 欧美国产精品一区二区三区 | 欧美在线国产精品 | 亚洲精品久久久久久宅男 | 日本成人在线观看网站 | 99爱在线免费观看 |