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

歡迎訪問 生活随笔!

生活随笔

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

java

groovy lambda_Java Lambda流和Groovy Clouse的比较

發(fā)布時間:2023/12/3 java 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 groovy lambda_Java Lambda流和Groovy Clouse的比较 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

groovy lambda

這篇博客文章將研究List數(shù)據(jù)結構上的一些諺語操作,并對Java 8/9和Groovy語法進行一些比較。

因此,首先是數(shù)據(jù)結構。 這只是一個簡單的橄欖球球員,具有名字和等級。

Java

class RugbyPlayer {private String name;private Integer rating;RugbyPlayer(String name, Integer rating) {this.name = name;this.rating = rating;}public String toString() {return name + "," + rating;}public String getName() {return name;}public Integer getRating() {return rating;} }//... //... List<RugbyPlayer> players = Arrays.asList(new RugbyPlayer("Tadgh Furlong", 9),new RugbyPlayer("Bundee AKi", 7),new RugbyPlayer("Rory Best", 8),new RugbyPlayer("Jacob StockDale", 8) );

Groovy

@ToString class RugbyPlayer {String nameInteger rating } //... //... List<RugbyPlayer> players = [new RugbyPlayer(name: "Tadgh Furlong", rating: 9),new RugbyPlayer(name: "Bundee AKi", rating: 7),new RugbyPlayer(name: "Rory Best", rating: 8),new RugbyPlayer(name: "Jacob StockDale", rating: 8) ]

查找特定記錄

Java

// Find Tadgh Furlong Optional<RugbyPlayer> result = players.stream().filter(player -> player.getName().indexOf("Tadgh") >= 0).findFirst(); String outputMessage = result.isPresent() ? result.get().toString() : "not found"; System.out.println(outputMessage);

Groovy

println players.find{it.name.indexOf("Tadgh") >= 0}

注釋

  • Java lambda中只有一個參數(shù)– player。 由于可以推斷其類型,因此無需鍵入。 注意:此lambda僅使用一個參數(shù)。 如果參數(shù)列表中有兩個參數(shù),則需要在參數(shù)列表中加上括號。
  • 在Java中,必須首先從List創(chuàng)建流。 然后,在執(zhí)行返回Optional的函數(shù)之前,先使用lambda
  • lambda定義不需要return語句。 它也不需要{}大括號或那些分號來完成Java語句。 但是,如果需要,可以使用{},如果需要,則必須包含;。 和return語句。 注意:如果lambda超過一行,則無法選擇,必須使用{}。 建議最佳實踐,以使Lambda短而僅占一行。
  • Java 8支持流水線操作的流利API。 Groovy收集操作也支持此功能。
  • 在Java中,為Lambda指定了播放器變量。 Groovy閉包不需要指定變量。 它只能使用“ it”,它是對參數(shù)的隱式引用(類似于Scala中的_)。
  • Java過濾器API接受Predicate類型的參數(shù)。 功能接口是指: 可用作lambda表達式或方法引用的分配目標。 謂詞是功能接口的類型。 它的一種抽象方法是:布爾測試(T t)。 在這種情況下,在lamda中,玩家對應于t。 主體定義應為true或false,在我們的例子中player.getName()。indexOf(“ Tadgh”)始終為true或false。 真對應于一場比賽。
  • Java 8還具有其他類型的功能接口:
    • 函數(shù) –它接受一個參數(shù)并返回結果
  • Java 8可以推斷l(xiāng)ambda輸入?yún)?shù)的類型。 請注意,如果必須指定參數(shù)類型,則聲明必須放在方括號中,以進一步增加詳細程度。
  • Groovy可以直接println。 不需要System.out,也不需要后續(xù)的花括號。
  • 像Java一樣,Groovy不需要return語句。 但是,這不僅適用于閉包,在Groovy中,它還擴展到了每種方法。 評估為最后一行的任何內容都會自動返回。
  • Groovy沒有功能接口的概念。 這意味著如果您忘記確保最后一個表達式是合適的布爾表達式,則會在運行時得到意外的結果和錯誤。
  • Groovy和Java中都使用了箭頭運算符來有效地表示同一件事–將參數(shù)列表與主體定義分開。 在Groovy中,只需要聲明參數(shù)即可(默認情況下不足夠)。 注意:在Scala中,使用=>。

查找特定記錄

Java

// Find all players with a rating over 8 List<RugbyPlayer> ratedPlayers = players.stream().filter(player -> player.getRating() >= 8).collect(Collectors.toList()); ratedPlayers.forEach(System.out::println);

Groovy

println players.findAll{it.rating >= 8}

注釋

  • 在Java版本中,Iterable ObjectratedPlayers調用了其forEach方法。 此方法采用類型為Consumer的FunctionalInterface(請參閱Jdoc, 在此處 )。 消費者,使用接收輸入?yún)?shù)但不返回任何參數(shù)的函數(shù),該函數(shù)無效。
  • System.out :: println是方法參考– Java 8中的新功能。它是語法糖,可以減少某些lambda的冗長性。 這實際上是說,對于ratedPlayers中的每個元素,都執(zhí)行System.out.println,并將當前元素作為參數(shù)傳入。
  • 再次減少了Groovy的語法。 該函數(shù)可以對集合進行操作,無需創(chuàng)建Stream。
  • 其實我們可以只打印了Java樣本在整個名單,但赫克我想演示的forEach和方法參考。

從對象類型映射到另一個

Java

// Map the Rugby players to just names. // Note, the way we convert the list to a stream and then back again to a to a list using the collect API. System.out.println("Names only..."); List<String> playerNames = players.stream().map(player -> player.getName()).collect(Collectors.toList()); playerNames.forEach(System.out::println);

Groovy

println players.collect{it.name}

注釋

  • 在執(zhí)行Lambda之前,首先需要創(chuàng)建一個流。 然后在Stream上調用collect()方法,這是將其轉換回List所必需的。 這使代碼更加冗長。

執(zhí)行減少量計算

Java

System.out.println("Max player rating only..."); Optional<Integer> maxRatingOptional = players.stream().map(RugbyPlayer::getRating).reduce(Integer::max); String maxRating = maxRatingOptional.isPresent() ? maxRatingOptional.get().toString() : "No max"; System.out.println("Max rating=" + maxRating);

Groovy

def here = players.inject(null){ max, it -> it.rating > max?.rating ? it : max }

注釋

  • 在Groovy注入閉包中使用了null安全運算符-以便進行第一次比較
  • 摘要

  • Groovy仍然更簡潔
  • 但是,Java中的某些操作是延遲運行的。 例如map(),filter()被認為是中間的。 除非在流上調用終端函數(shù),例如forEach,collect,reduce,否則它們將不會執(zhí)行。 在某些情況下,這可能會使代碼更冗長,但也意味著它可以提高性能。
  • Groovy還提供了一些惰性函數(shù)。
  • 完整的Java代碼在這里 。 完整的Groovy代碼在這里 。

    翻譯自: https://www.javacodegeeks.com/2018/07/java-lambda-streams-and-groovy-clouses-comparisons.html

    groovy lambda

    總結

    以上是生活随笔為你收集整理的groovy lambda_Java Lambda流和Groovy Clouse的比较的全部內容,希望文章能夠幫你解決所遇到的問題。

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