Java 8 到 Java 14,改變了哪些你寫代碼的方式?

前幾天,JDK 14 正式發佈了,此次發佈的新版本一共包含了16個新的特性。html

其實,從Java8 到 Java14 ,真正的改變了程序員寫代碼的方式的特性並很少,咱們這篇文章就來看一下都有哪些。java

Lambda表達式

Lambda 表達式是 Java 8 中最重要的一個新特性,Lambda 容許把函數做爲一個方法的參數。程序員

lambda 表達式的語法格式以下:sql

(parameters) -> expression
或
(parameters) ->{ statements; }複製代碼

如如下例子:數據庫

// 1. 不須要參數,返回值爲 5  
() -> 5  

// 2. 接收一個參數(數字類型),返回其2倍的值  
x -> 2 * x  

// 3. 接受2個參數(數字),並返回他們的差值  
(x, y) -> x – y  

// 4. 接收2個int型整數,返回他們的和  
(int x, int y) -> x + y  

// 5. 接受一個 string 對象,並在控制檯打印,不返回任何值(看起來像是返回void)  
(String s) -> System.out.print(s)複製代碼

Lambda表達式具備簡潔、容易進行並行計算、是將來的編程趨勢等優勢,但同時也會帶來調試困難,新人理解成本高等缺點。express

Streams API

除了Lambda 表達式外,Java 8中還引入了Stream API,這使得Java終於進入到函數式編程的行列中來了。編程

Stream 使用一種相似用 SQL 語句從數據庫查詢數據的直觀方式來提供一種對 Java 集合運算和表達的高階抽象。api

Stream API能夠極大提升Java程序員的生產力,讓程序員寫出高效率、乾淨、簡潔的代碼。安全

以下圖,就是經過Stream API對集合進行了一系列的操做:函數式編程

List<String> strings = Arrays.asList("Hollis", "HollisChuang", "hollis", "Hello", "HelloWorld", "Hollis");
Stream s = strings.stream().filter(string -> string.length()<= 6).map(String::length).sorted().limit(3)
            .distinct();複製代碼

並且,Stream還支持並行流,在性能上比傳統的for循環要好不少。(詳細用法:《Java 8中處理集合的優雅姿式——Stream》)

從Lambda表達式和Stream API問世至今,已經有6年的時間了,相信不少人已經在工做中使用過這些特性了。

雖然對於這兩種語法的使用,不少人持有不一樣的見解,可是做者仍是認爲這個功能是十分好用的,只是在平常寫代碼的時候不要過度"炫技"使用超長的流式操做,代碼可讀性不要過低就能夠了。

新的日期和時間 API

在Java 8以前,日期時間 API 存在諸多問題,如:Date非線程安全、java.util和java.sql的包中都有日期類、日期類並不提供國際化,沒有時區支持。

因此,Java 8經過發佈新的Date-Time API (JSR 310)來進一步增強對日期與時間的處理。

新的java.time包涵蓋了全部處理日期,時間,日期/時間,時區,時刻(instants),過程(during)與時鐘(clock)的操做。

常見操做以下:

// 獲取當前的日期時間
LocalDateTime currentTime = LocalDateTime.now();
System.out.println("當前時間: " + currentTime);

// 時間比較
LocalDate today = LocalDate.now();
LocalDate date1 = LocalDate.of(2014, 01, 14);
if(date1.equals(today)){} 

// 時間增長
LocalTime time = LocalTime.now();
LocalTime newTime = time.plusHours(2); // adding two hours複製代碼

可是說實話,Java8中的時間API做者平常工做中用的比較少,主要是有不少歷史代碼,仍是依賴Date等類型,使用新的API就要面臨互相轉換問題。

本地變量類型推斷

在Java 10以前版本中,咱們想定義定義局部變量時。咱們須要在賦值的左側提供顯式類型,並在賦值的右邊提供實現類型:

MyObject value = new MyObject();複製代碼

在Java 10中,提供了本地變量類型推斷的功能,能夠經過var聲明變量:

var value = new MyObject();複製代碼

本地變量類型推斷將引入「var」關鍵字,而不須要顯式的規範變量的類型。

其實,所謂的本地變量類型推斷,也是Java 10提供給開發者的語法糖。雖然咱們在代碼中使用var進行了定義,可是對於虛擬機來講他是不認識這個var的,在java文件編譯成class文件的過程當中,會進行解糖,使用變量真正的類型來替代var(我反編譯了Java 10的本地變量類型推斷

Switch 表達式

在JDK 12中引入了Switch表達式做爲預覽特性。並在Java 13中修改了這個特性,引入了yield語句,用於返回值。

而在以後的Java 14中,這一功能正式做爲標準功能提供出來。

在之前,咱們想要在switch中返回內容,仍是比較麻煩的,通常語法以下:

int i;
switch (x) {
    case "1":
        i=1;
        break;
    case "2":
        i=2;
        break;
    default:
        i = x.length();
        break;
}複製代碼

在JDK13中使用如下語法:

int i = switch (x) {
    case "1" -> 1;
    case "2" -> 2;
    default -> {
        int len = args[1].length();
        yield len;
    }
};複製代碼

或者

int i = switch (x) {
    case "1": yield 1;
    case "2": yield 2;
    default: {
        int len = args[1].length();
        yield len;
    }
};複製代碼

在這以後,switch中就多了一個關鍵字用於跳出switch塊了,那就是yield,他用於返回一個值。和return的區別在於:return會直接跳出當前循環或者方法,而yield只會跳出當前switch塊。

Text Blocks

Java 13中提供了一個Text Blocks的預覽特性,而且在Java 14中提供了第二個版本的預覽。

text block,文本塊,是一個多行字符串文字,它避免了對大多數轉義序列的須要,以可預測的方式自動格式化字符串,並在須要時讓開發人員控制格式。

咱們之前從外部copy一段文本串到Java中,會被自動轉義,若有一段如下字符串:

<html>
  <body>
      <p>Hello, world</p>
  </body>
</html>複製代碼

將其複製到Java的字符串中,會展現成如下內容:

"<html>\n" +
"    <body>\n" +
"        <p>Hello, world</p>\n" +
"    </body>\n" +
"</html>\n";複製代碼

即被自動進行了轉義,這樣的字符串看起來不是很直觀,在JDK 13中,就可使用如下語法了:

"""
<html>
  <body>
      <p>Hello, world</p>
  </body>
</html>
""";複製代碼

使用"""做爲文本塊的開始符合結束符,在其中就能夠放置多行的字符串,不須要進行任何轉義。看起來就十分清爽了。

如常見的SQL語句:

String query = """
    SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`
    WHERE `CITY` = 'INDIANAPOLIS'
    ORDER BY `EMP_ID`, `LAST_NAME`;
""";複製代碼

看起來就比較直觀,清爽了。

Records

Java 14 中便包含了一個新特性:EP 359: Records,

Records的目標是擴展Java語言語法,Records爲聲明類提供了一種緊湊的語法,用於建立一種類中是「字段,只是字段,除了字段什麼都沒有」的類。經過對類作這樣的聲明,編譯器能夠經過自動建立全部方法並讓全部字段參與hashCode()等方法。這是JDK 14中的一個預覽特性。

使用record關鍵字能夠定義一個記錄:

record Person (String firstName, String lastName) {}複製代碼

record 解決了使用類做爲數據包裝器的一個常見問題。純數據類從幾行代碼顯著地簡化爲一行代碼。(詳見:Java 14 發佈了,不使用」class」也能定義類了?還順手要幹掉Lombok!

總結

以上,就是從Java 8 到 Java 14中,新推出的可能會影響開發人員寫代碼的方式的一些主要特性。

不知道你們有沒有發現,最近幾個版本中推出的一些功能,使得Java和Kotlin等語言愈來愈像了...

新的這些功能,確實在必定程度上能夠簡化一些代碼,使得開發過程當中更加高效,可是說實話,尚未好到足夠吸引廣大開發者拋棄Java 8進行大規模遷移!

仍是那句話:版本任你發,我用Java 8;可是新特性咱們仍是要去了解下的。

相關文章
相關標籤/搜索