groovy lambda_Java Lambda流和Groovy Clouse的比较
生活随笔
收集整理的這篇文章主要介紹了
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 }注釋
摘要
完整的Java代碼在這里 。 完整的Groovy代碼在這里 。
翻譯自: https://www.javacodegeeks.com/2018/07/java-lambda-streams-and-groovy-clouses-comparisons.html
groovy lambda
總結
以上是生活随笔為你收集整理的groovy lambda_Java Lambda流和Groovy Clouse的比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: s4天使30天赋(s4天使是什么羁绊)
- 下一篇: java美元兑换,(Java实现) 美元