日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

如何在Java 8中将Lambda表达式转换为方法引用?

發(fā)布時間:2023/12/3 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何在Java 8中将Lambda表达式转换为方法引用? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如果您使用Java 8進行編碼,那么您會知道使用方法引用代替lambda表達式會使您的代碼更具可讀性,因此建議盡可能使用方法引用替換lambda表達式,但是,最大的問題是,您如何查找是否可以用方法引用替換lambda? 是的,這并不是那么容易,尤其是如果您僅使用Java 8幾個月,并且一直在努力將各種功能性編程概念和習慣用法整理在腦海中。 無論如何,用方法引用替換lambda表達式的簡單規(guī)則是建立在常識之上的,您將在本文中學習。

如果仔細觀察,lambda就是傳遞給函數執(zhí)行的代碼。 如果您已經具有方法形式的代碼,則可以傳遞方法引用,而不是將新代碼作為lambda傳遞。 就是這樣,但是我知道,說起來容易做起來難,因此我提供了許多示例來解釋Java 8中的這個概念。

如何用Java 8中的方法參考替換lambda表達式

如果您將lambda表達式用作匿名函數,但不對傳入的參數進行任何操作,則可以將lambda表達式替換為方法引用。 下面的代碼是用方法參考替換lambda的好例子

listOfNumbers.stream().sorted().forEach(number -> {System.out.println(number);} );

由于我們這里沒有修改number參數,因此可以替換lambda表達式:

number -> { System.out.println(number); }

方法參考如下所示:

listOfNumbers.stream().sorted.forEach(System.out::println);

但是,如果您在將參數傳遞給另一個方法之前修改了該參數,則無法用方法引用替換lambda,例如,在以下情況下,我們無法這樣做:

listOfNumbers.stream().sorted().forEach(number -> {System.out.println(String.valueOf(number));} );

雙冒號(::)運算符用于方法引用,實際上有三種主要用法:

object::instanceMethod Class::staticMethod Class:instanceMethod

在前兩種情況下,方法引用等效于提供方法參數的lambda表達式,例如
System.out :: println等效于
x-> System.out.println(x)和 Math :: pow等效于 (x,y)-> Math.pow(x,y)。

在這種情況下,第一個參數成為方法的目標。 例如,
String :: compareToIgnoreCase與

(x, y) -> x.compareToIgnoreCase(y)

或this :: equals與

(x -> this.equals(x))

您可以閱讀有關在Java SE 8中將這種類型的lambda表達式轉換為方法參考的更多信息,有關Really Im Patient的內容 ,對此主題有更多的解釋和示例。

用方法引用替換lambda表達式的另一個很好的示例是以下代碼,該代碼在Java 8中按值對映射進行排序 :

Map sortByValue = map.entrySet() .stream() .sorted(Map.Entry.<String, Integer>comparingByValue()) .collect(Collectors.toMap(e -> e.getKey(),e -> e.getValue()));

可以使用方法參考重寫為以下內容:

Map sortByValue = map.entrySet() .stream() .sorted(Map.Entry.<String, Integer>comparingByValue()) .collect(toMap(Map.Entry::getKey,Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));

如果您仔細觀察,我們將e-> e.getKey()替換為
Map.Entry :: getKey和e-> g.getValue()到
Map.Entry :: getValue,因為我們已經以getKey()和getValue()方法的形式編寫了這些lambda表達式所執(zhí)行的代碼。

這就是何時以及如何用Java 8中的方法引用替換lambda表達式的全部內容。 僅在不進行任何修改的情況下才可以替換,否則就不能替換。 為什么要這么做? 好吧,因為方法引用比lambda表達式更簡潔易讀。

Java 8的新增功能

Java SE 8實在不耐煩

使用Lambda表達式從Java 8中的集合到流

Java 8中用于數據處理的流,收集器和可選項

相關的Java 8教程

如果您有興趣學習有關Java 8的新功能的更多信息,這是我以前的文章,介紹Java 8的一些重要概念:

  • Java 8中20個日期和時間的示例( 教程 )
  • 從零開始學習Java 8的5本書( 書籍 )
  • 如何在Java 8中連接String( 示例 )
  • 如何在Java 8中使用filter()方法( 教程 )
  • 如何在Java 8中使用LocalDateTime格式化/解析日期? ( 教程 )
  • 如何在Java 8中使用Stream類( 教程 )
  • 如何在Java 8中使用forEach()方法( 示例 )
  • 如何在Java 8中將列表轉換為Map( 解決方案 )
  • 如何在Java 8中使用peek()方法( 示例 )
  • 如何在Java 8中按鍵對地圖排序? ( 示例 )
  • Java 8中的Optionals的10個示例? ( 示例 )

感謝您到目前為止閱讀本文。 如果您喜歡這篇文章,請與您的朋友和同事分享。 如果您有任何問題或反饋,請發(fā)表評論。

翻譯自: https://www.javacodegeeks.com/2017/08/convert-lambda-expression-method-reference-java-8.html

總結

以上是生活随笔為你收集整理的如何在Java 8中将Lambda表达式转换为方法引用?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。