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

歡迎訪問 生活随笔!

生活随笔

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

java

q7goodies事例_Java 8 Friday Goodies:Lambda和排序

發布時間:2023/12/3 java 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 q7goodies事例_Java 8 Friday Goodies:Lambda和排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

q7goodies事例

在Data Geekery ,我們喜歡Java。 而且,由于我們真的很喜歡jOOQ的流暢的API和查詢DSL ,我們對Java 8將為我們的生態系統帶來什么感到非常興奮。 我們已經寫了一些關于Java 8好東西的博客 ,現在我們覺得是時候開始一個新的博客系列了,……

Java 8星期五

每個星期五,我們都會向您展示一些不錯的教程風格的Java 8新功能,這些功能利用了lambda表達式,擴展方法和其他出色的功能。 您可以在GitHub上找到源代碼 。

Java 8 Goodie:Lambda和排序

排序數組和集合是Java 8 lambda表達式的絕佳用例,原因很簡單,因為Comparator自從JDK 1.2引入以來一直都是@FunctionalInterface 。 現在,我們可以將lambda表達式形式的Comparators提供給各種sort()方法。

對于以下示例,我們將使用此簡單的Person類:

static class Person {final String firstName;final String lastName;Person(String firstName, String lastName) {this.firstName = firstName;this.lastName = lastName;}@Overridepublic String toString() {return "Person{" +"firstName='" + firstName + '\'' +", lastName='" + lastName + '\'' +'}';} }

顯然,我們也可以通過使它實現Comparable來向Person添加自然排序,但是讓我們關注外部Comparators 。 考慮以下Person列表,其名稱是使用一些在線隨機名稱生成器生成的:

List<Person> people = Arrays.asList(new Person("Jane", "Henderson"),new Person("Michael", "White"),new Person("Henry", "Brighton"),new Person("Hannah", "Plowman"),new Person("William", "Henderson") );

我們可能想按姓氏然后按名字對它們進行排序。

用Java 7排序

這樣的Comparator器的一個“經典” Java 7示例是這樣的:

people.sort(new Comparator<Person>() {@Overridepublic int compare(Person o1, Person o2) {int result = o1.lastName.compareTo(o2.lastName);if (result == 0)result = o1.firstName.compareTo(o2.firstName);return result;} }); people.forEach(System.out::println);

以上將產生:

Person{firstName='Henry', lastName='Brighton'} Person{firstName='Jane', lastName='Henderson'} Person{firstName='William', lastName='Henderson'} Person{firstName='Hannah', lastName='Plowman'} Person{firstName='Michael', lastName='White'}

用Java 8排序

現在,讓我們將以上內容翻譯為等效的Java 8代碼:

Comparator<Person> c = (p, o) ->p.lastName.compareTo(o.lastName);c = c.thenComparing((p, o) ->p.firstName.compareTo(o.firstName));people.sort(c); people.forEach(System.out::println);

結果顯然是相同的。 如何閱讀以上內容? 首先,我們為本地Person Comparator變量分配一個lambda表達式:

Comparator<Person> c = (p, o) ->p.lastName.compareTo(o.lastName);

與Scala,C#或Ceylon不同,它們通過val關鍵字(或類似關鍵字) 知道從表達式到局部變量聲明的類型推斷,而Java從變量(或參數,成員)聲明向要分配的表達式執行類型推斷。

換句話說,類型推斷是從“左到右”而不是從“右到左”執行的。 這使得鏈接Comparators有點麻煩,因為Java編譯器無法將lambda表達式的類型推斷延遲到將比較器傳遞給sort()方法之前。

但是,一旦為變量分配了Comparator ,就可以通過thenComparing()流暢地鏈接其他比較器:

c = c.thenComparing((p, o) ->p.firstName.compareTo(o.firstName));

最后,我們將其傳遞給List的新sort()方法,這是直接在List接口上實現的默認方法:

default void sort(Comparator<? super E> c) {Collections.sort(this, c); }

上述限制的解決方法

雖然Java的類型推斷“局限性”可能會讓人感到沮喪,但我們可以通過創建通用的IdentityComparator來解決類型推斷:

class Utils {static <E> Comparator<E> compare() {return (e1, e2) -> 0;} }

使用上面的compare()方法,我們可以編寫以下流暢的比較器鏈:

people.sort(Utils.<Person>compare().thenComparing((p, o) -> p.lastName.compareTo(o.lastName)).thenComparing((p, o) -> p.firstName.compareTo(o.firstName)) );people.forEach(System.out::println);

提取密鑰

這可以變得更好。 由于我們通常從兩個Comparator參數比較相同的POJO / DTO值,因此我們可以通過“鍵提取器”功能將它們提供給新的API。 它是這樣工作的:

people.sort(Utils.<Person>compare().thenComparing(p -> p.lastName).thenComparing(p -> p.firstName)); people.forEach(System.out::println);

因此,在給定Person p我們為API提供了提取例如p.lastName 。 實際上,一旦我們使用了鍵提取器,我們就可以省略自己的實用程序方法,因為這些庫還有一個comparing()方法來初始化整個鏈:

people.sort(Comparator.comparing((Person p) -> p.lastName).thenComparing(p -> p.firstName)); people.forEach(System.out::println);

同樣,我們需要幫助編譯器,因為它不能推斷所有類型,即使原則上在這種情況下sort()方法將提供足夠的信息。 要了解有關Java 8的通用類型推斷的更多信息,請參見我們以前的博客文章 。

結論

與Java 5一樣,可以在JDK庫中看到升級的最大改進。 當Java 5為Comparators帶來類型安全性時,Java 8使它們易于讀取和編寫(給出或接受奇數類型推理怪癖)。

Java 8將徹底改變我們編程的方式,下周,我們將看到Java 8如何影響我們與SQL交互的方式。

參考: Java 8 Friday Goodies:Lambda和Sorting,來自我們的JCG合作伙伴 Lukas Eder,在Java,SQL和JOOQ博客中。

翻譯自: https://www.javacodegeeks.com/2014/02/java-8-friday-goodies-lambdas-and-sorting.html

q7goodies事例

總結

以上是生活随笔為你收集整理的q7goodies事例_Java 8 Friday Goodies:Lambda和排序的全部內容,希望文章能夠幫你解決所遇到的問題。

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