Java 8的功能基础
Java 8徹底改變了Java。 它很可能是過去10年中最重要的Java版本。 有很多新功能,包括默認方法,方法和構(gòu)造函數(shù)引用以及l(fā)ambda, 僅舉幾例 。
更有趣的功能之一是新的java.util.stream API,正如Javadoc所述,該API支持
元素流上的函數(shù)式操作,例如集合上的map-reduce轉(zhuǎn)換
將此新API與lambda表達式結(jié)合使用,您將獲得簡潔但功能強大的語法,該語法可通過應用投影顯著簡化代碼。
以表面上簡單的過濾集合為例。 在這種情況下,將創(chuàng)建一個簡單的Message類型Collection ,如下所示:
創(chuàng)建消息集合
List<Message> messages = new ArrayList<>(); messages.add(new Message("aglover", "foo", 56854)); messages.add(new Message("aglover", "foo", 85)); messages.add(new Message("aglover", "bar", 9999)); messages.add(new Message("rsmith", "foo", 4564));通過這個集合,我想過濾出Message ,其delay (第3個構(gòu)造函數(shù)參數(shù))大于3,000秒。
在Java 8之前 ,您可以像這樣手動阻塞這種邏輯:
過濾舊派風格
for (Message message : messages) {if (message.delay > 3000) {System.out.println(message);} }但是,在Java 8中,此工作變得更加簡潔。 集合現(xiàn)在支持stream方法,該方法將基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為可迭代的對象流,從而允許使用lambda表達式的新型功能操作。 這些操作大多數(shù)也可以鏈接在一起。 這些可鏈接的方法稱為“ 中間” ,不能鏈接的方法稱為“ 終端” 。
簡而言之,lambda表達式與匿名類非常相似,只是語法更少 。 例如,如果您在Javadocs中查找Stream的filter方法的參數(shù),則會看到它采用了Predicate類型。 但是,您不必像在使用匿名類的Java 8之前那樣實現(xiàn)該接口。 因此,用于過濾所有大于3000的delay值的Predicate lambda表達式為:
Lambda表達式
x -> x.delay > 3000其中, x是為流中的每個值傳遞的參數(shù), ->右邊的所有內(nèi)容都是要求值的表達式。
將所有這些放到Java 8中可以得出:
流lambdas!
messages.stream().filter(m -> m.delay > 3000).forEach(item -> System.out.println(item));有趣的是,由于Java 8的其他一些新功能, forEach的lambda可以進一步簡化為:
流lambda更短!
messages.stream().filter(m -> m.delay > 3000).forEach(System.out::println);因為forEach lambda的參數(shù)僅由println ,所以Java 8現(xiàn)在允許您完全刪除該參數(shù)。
之前,我提到過流允許您鏈接lambda-在上述情況下, filter方法是一種中間方法,而forEach是一種終端方法。 功能程序員可以立即識別的其他中間方法是: map , flatMap和reduce ,僅舉幾例。
詳細地說,我想查找所有延遲超過3,000秒的Message ,并總結(jié)總延遲時間。 沒有功能魔術(shù),我可以寫:
普通的Java
long totalWaitTime = 0; for (Message message : messages) {if (message.delay > 3000) {totalWaitTime += message.delay;} }不過,使用Java 8和一些function-foo,您可以實現(xiàn)更優(yōu)雅的代碼構(gòu)造,如下所示:
Java 8優(yōu)雅
long totWaitTime = messages.stream().filter(m -> m.delay > 3000).mapToLong(m -> m.delay).sum();請注意,我如何鏈接filter和mapToLong方法以及終端sum 。 順便說一句, sum方法需要一種特定的地圖樣式方法,該方法可產(chǎn)生基本類型的集合,例如mapToLong , mapToInt等。
功能樣式編程作為一種核心語言功能,是一種非常強大的結(jié)構(gòu)。 而且,盡管許多技術(shù)在諸如Guava之類的各種第三方庫中以及諸如Scala和Groovy之類的JVM語言中已經(jīng)可用,但擁有這些語言核心的這些功能肯定會吸引更多的開發(fā)人員,并對開發(fā)前景產(chǎn)生最大的影響。
毫無疑問,Java 8極大地改變了Java語言 。
翻譯自: https://www.javacodegeeks.com/2014/03/java-8s-functional-fomentation.html
總結(jié)
以上是生活随笔為你收集整理的Java 8的功能基础的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 精简SWT FormLayout的用法
- 下一篇: JavaFX技巧1:可调整大小的Canv