快速回顧
1.lambda表達式: (參數) -> {主體}
lambda表達式打開了函數式編程愛好者繼續使用java的大門。lambda表達式需要零個或多個參數,這些參數可以在表達式主體中訪問,并隨計算結果一起返回。
comparator<integer> comparator = (a, b) -> a-b;
system.out.println(comparator.compare(3, 4)); // -1
2. 函數接口:只有一種方法的接口
lambda表達式本身被視為可以分配給函數接口的功能接口,如上所示。java 8還提供了如下所示的新功能構造:
bifunction<integer, integer, integer> comparator = (a, b) -> a-b;
system.out.println(comparator.apply(3, 4)); // -1
有關更多功能結構,請參閱java.util.function包,其擁有:function,supplier,consumer,predicate等。還可以使用下面注解來定義函數接口:
@functionalinterface
接口還可以具有方法的一個或多個默認實現,并且仍然可以保持為函數接口。它有助于避免不必要的抽象基類的默認實現。
可以使用::操作符訪問靜態和實例方法,并且可以使用 ::new訪問構造函數,并且可以將它們作為函數參數傳遞,例如system.out::println .
3.流:不僅僅是迭代
流是一系列對象和操作。 接口中添加了許多默認方法,以支持流的foreach, filter, map和reduce構造。提供集合的java庫現在支持流。 例如 bufferredreader.lines()。 所有集合都可以輕松轉換為流。 還支持并行流操作,它在內部分配到多個cpu上的操作。
1)中間操作:懶惰性操作
對中間操作的懶惰執行時,在調用終止操作之前不會發生任何事情。
map(mapping):每個元素是一對一的,并轉換為另一種形式。
filter(predicate):給定謂詞為true的過濾元素。
peek(),limit()和sorted()是其他中間操作。
2)終止操作:結果化操作
foreach(consumer):遍歷每個元素并消費該元素
reduce(initialvalue,accumulator):它以initialvalue開頭,并在每個元素上迭代,并以最終返回的值來保持值更新。
collect(collector):這是一個懶惰的評估結果,需要使用收集器收集,例如java.util.stream.collectors,包括tolist(),join(),summarizingx(),averagingx(),groupby(), 和partitionby()。
4. optional:消除null編程
基于null的編程被認為是糟糕的,但幾乎沒有任何選擇可以提前避免它。我們現在可以在optional對象中測試ispresent(),而不是測試null。 讀取它(流也有多個構造和操作)返回optional對象。
5. jvm變化:permgen已退役
permgen已被完全刪除并被metaspace取代。 元空間(metaspace)不再是堆內存的一部分,而是分配給進程的本機內存的一部分。 jvm調優現在需要不同的方面,因為監控是必需的,不僅對于堆,而且也包括對本機內存。
某些gc的組合已棄用。 gc根據環境配置自動分配。
還有其它的變化,包括nio、datetime、security、簡潔的jdk配置文件以及jdeps,jjs,javascript engine工具等。
6.java 9:延續上一版慣例
java 9已經存在了一年多了,繼續保持8的傳統。 但它的關鍵特征模塊系統仍然沒有很好地被采用。 在我看來,在主流中真正采用這些功能還需要更多時間。 它以設計類的方式挑戰開發人員。 他們現在需要在應用程序模塊方面考慮更多,而不僅僅是一組類。 無論如何,這是傳統開發人員通過基于微服務的開發所面臨的類似挑戰。 java 9繼續添加函數式編程功能,以保持java的活力并改進jvm內部。
1)java平臺模塊系統:小即是大
java 9最著名的特性是java平臺模塊系統(jpms)。 這是邁向真正封裝的重要一步。 把一個大模塊打破為由密切相關的代碼和數據組成的小而清晰的模塊。 它類似于osgi包,其中每個包定義它消耗的依賴關系并公開其他模塊所依賴的東西。
它引入了編譯和運行時之間的裝配階段,可以構建jdk和jre的自定義運行時映像。 現在,jdk本身由模塊組成。
1
2
3
4
5
6
|
~ java --list-modules java.activation @9 .0. 2 java.base @9 .0. 2 java.compiler @9 .0. 2 java.corba @9 .0. 2 ... |
這些模塊稱為系統模塊。 沒有模塊信息的jar被加載到未命名的模塊中。 我們可以通過在文件module-info.java中提供以下信息來定義我們自己的應用程序模塊:
requires—依賴于其他模塊
exports—導出模塊中包的公共api/接口
opens— 打開反射訪問包
uses— 類似requires。
要了解更多信息,請參閱快速入門指南()。
2)創建模塊示例
以下是intellij ide中的快速步驟:
1. 在intellij創建模塊: 到file > new > module - "first.module"
2. 在模塊下的src中創建java類(/first.module/src)
3. 編寫代碼
1
2
3
4
5
6
|
package com.test.modules.print; public class printer { public static void print(string input){ system.out.println(input); } } |
4. 添加module-info.java : /first.module/src > new > package
1
2
3
|
module first.module { exports com.test.modules.print; // 導出包的公共apis. } |
5. 與前面相似,創建模塊 " main.module " 和 main.java :
1
2
3
|
module main.module { requires first.module; } |
main文件代碼:
1
2
3
4
5
6
7
|
package com.test.modules.main; import com.test.modules.print.printer; public class main { public static void main(string[] args) { printer.print( "hello world" ); } } |
6. intellij自動編譯它并記錄依賴項和--module-source-path
7.要運行main.java,它需要--module-path或-m
1
2
3
|
java -p /workspaces/rnd/out/production/main.module:/workspaces/rnd/out/production/first.module -m main.module/com.test.modules.main.main hello world process finished with exit code 0 |
所以,通過這種方式,我們就可以定義模塊了。
3)其它新特性
java 9附帶了許多其他功能。 下面列出了一些重要的部分(也是為了追趕競爭對手):
響應式編程 - java 9引入了響應流,它支持react,就像發布者和消費者之間的異步/等待通信一樣。 它在flow類中添加了標準接口。
jshell- java shell - 就像任何其他腳本語言一樣,java現在可以用作腳本語言。
流和集合增強:java 9添加了一些與"有序"和"可選"流操作相關的api。 添加of()操作以簡化創建集合,就像javascript一樣。
jvm自我調優
g1是默認的gc,gc中的自我調優功能也有所改進。cms已被棄用。
訪問堆棧
stackwalker類被添加到對堆棧幀的延遲訪問中,我們可以遍歷并過濾到它。
多發行版jar文件:mrjar
一個java程序可能包含與多個版本兼容的類。 說實話,我不確定這個功能有多么有用。
7.java 10:更接近函數型語言
1)類型推斷
java 10帶來了javascript的var。 您不僅可以自由聲明變量的類型,還可以自由的構建集合類型。 以下內容在java 10中有效:
1
2
3
|
var test = "9" ; test = 1.0 ; var set = set.of( 5 , "x" , 6.5 , new object()); |
代碼變得越來越冗長,腳本語言的魔力越來越多地被添加到java中。 它肯定會給java帶來這些功能的負面影響,但它給開發人員帶來了很多動力。
2)更強大的jvm
在并行情況下,gc完全觸發g1以提高整體性能。
堆分配可以在連接到系統的備用存儲設備上分配。 它將有助于確定系統上java進程的優先級。 與重要的優先級相比,低優先級的存儲器可以使用慢速存儲器。
java 10還改進了本地握手線程中的線程處理。 還增加了前期編譯(實驗性的)。 針對循環生成增強的字節碼是java 10的另一個有趣特性。
3)增強的語言級特性
在java 10中,我們改進了optional、不可修改的集合api。
結論
我們已經看到了從java 8到java 10的歷程以及java受其他函數和腳本語言的影響。 java是一種強大的面向對象編程語言,同時,它現在支持許多功能型結構。 java不僅會帶來其他語言的頂級功能,還會不斷改進內部功能。 它正以極快的速度發展,保持跟進——在它逐步淘汰之前! 因為,java 11、12已在路上!
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。如果你想了解更多相關內容請查看下面相關鏈接
原文鏈接:https://www.toutiao.com/i6599664767789433348/