如何在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與
或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表达式转换为方法引用?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 应用服务器web服务器_最受欢迎的应用服
- 下一篇: Java命令行界面(第23部分):Rop