Java9都快發佈了,Java8的十大新特性你瞭解多少呢?

来源:http://www.cnblogs.com/pkufork/archive/2016/08/03/java_8.html
-Advertisement-
Play Games

Java 9預計將於今年9月份發佈,這是否會是一次里程碑式的版本,我們拭目以待。今天,我們先來複習一下2014年發佈的Java 8的十大新特性。 Java 8可謂是自Java 5以來最具革命性的版本了,她在語言、編譯器、類庫、開發工具以及Java虛擬機等方面都帶來了不少新特性。我們來一一回顧一下這些 ...


Java 9預計將於今年9月份發佈,這是否會是一次里程碑式的版本,我們拭目以待。今天,我們先來複習一下2014年發佈的Java 8的十大新特性。

Java 8可謂是自Java 5以來最具革命性的版本了,她在語言、編譯器、類庫、開發工具以及Java虛擬機等方面都帶來了不少新特性。我們來一一回顧一下這些特性。

一、Lambda表達式

Lambda表達式可以說是Java 8最大的賣點,她將函數式編程引入了Java。Lambda允許把函數作為一個方法的參數,或者把代碼看成數據。

一個Lambda表達式可以由用逗號分隔的參數列表、–>符號與函數體三部分表示。例如:

Arrays.asList( "p", "k", "u","f", "o", "r","k").forEach( e -> System.out.println( e ) );

 1 Arrays.asList( "p", "k", "u","f", "o", "r","k").forEach( e -> System.out.println( e ) ); 

為了使現有函數更好的支持Lambda表達式,Java 8引入了函數式介面的概念。函數式介面就是只有一個方法的普通介面。java.lang.Runnable與java.util.concurrent.Callable是函數式介面最典型的例子。為此,Java 8增加了一種特殊的註解@FunctionalInterface:

1 @FunctionalInterface
2 public interface Functional {
3     void method();
4 }

二、介面的預設方法與靜態方法

我們可以在介面中定義預設方法,使用default關鍵字,並提供預設的實現。所有實現這個介面的類都會接受預設方法的實現,除非子類提供的自己的實現。例如:

1 public interface DefaultFunctionInterface {
2     default String defaultFunction() {
3         return "default function";
4     }
5 }

我們還可以在介面中定義靜態方法,使用static關鍵字,也可以提供實現。例如:

1 public interface StaticFunctionInterface {
2     static String staticFunction() {
3         return "static function";
4     }
5 }

介面的預設方法和靜態方法的引入,其實可以認為引入了C++中抽象類的理念,以後我們再也不用在每個實現類中都寫重覆的代碼了。

三、方法引用

通常與Lambda表達式聯合使用,可以直接引用已有Java類或對象的方法。一般有四種不同的方法引用:

  1. 構造器引用。語法是Class::new,或者更一般的Class< T >::new,要求構造器方法是沒有參數;

  2. 靜態方法引用。語法是Class::static_method,要求接受一個Class類型的參數;

  3. 特定類的任意對象方法引用。它的語法是Class::method。要求方法是沒有參數的;

  4. 特定對象的方法引用,它的語法是instance::method。要求方法接受一個參數,與3不同的地方在於,3是在列表元素上分別調用方法,而4是在某個對象上調用方法,將列表元素作為參數傳入;

四、重覆註解

在Java 5中使用註解有一個限制,即相同的註解在同一位置只能聲明一次。Java 8引入重覆註解,這樣相同的註解在同一地方也可以聲明多次。重覆註解機制本身需要用@Repeatable註解。Java 8在編譯器層做了優化,相同註解會以集合的方式保存,因此底層的原理並沒有變化。

五、擴展註解的支持

Java 8擴展了註解的上下文,幾乎可以為任何東西添加註解,包括局部變數、泛型類、父類與介面的實現,連方法的異常也能添加註解。

六、Optional

Java 8引入Optional類來防止空指針異常,Optional類最先是由Google的Guava項目引入的。Optional類實際上是個容器:它可以保存類型T的值,或者保存null。使用Optional類我們就不用顯式進行空指針檢查了。

七、Stream

Stream API是把真正的函數式編程風格引入到Java中。其實簡單來說可以把Stream理解為MapReduce,當然Google的MapReduce的靈感也是來自函數式編程。她其實是一連串支持連續、並行聚集操作的元素。從語法上看,也很像linux的管道、或者鏈式編程,代碼寫起來簡潔明瞭,非常酷帥!

八、Date/Time API (JSR 310)

Java 8新的Date-Time API (JSR 310)受Joda-Time的影響,提供了新的java.time包,可以用來替代 java.util.Date和java.util.Calendar。一般會用到Clock、LocaleDate、LocalTime、LocaleDateTime、ZonedDateTime、Duration這些類,對於時間日期的改進還是非常不錯的。

九、JavaScript引擎Nashorn

Nashorn允許在JVM上開發運行JavaScript應用,允許Java與JavaScript相互調用。

十、Base64

在Java 8中,Base64編碼成為了Java類庫的標準。Base64類同時還提供了對URL、MIME友好的編碼器與解碼器。

除了這十大新特性之外,還有另外的一些新特性:

  • 更好的類型推測機制:Java 8在類型推測方面有了很大的提高,這就使代碼更整潔,不需要太多的強制類型轉換了。

  • 編譯器優化:Java 8將方法的參數名加入了位元組碼中,這樣在運行時通過反射就能獲取到參數名,只需要在編譯時使用-parameters參數。

  • 並行(parallel)數組:支持對數組進行並行處理,主要是parallelSort()方法,它可以在多核機器上極大提高數組排序的速度。

  • 併發(Concurrency):在新增Stream機制與Lambda的基礎之上,加入了一些新方法來支持聚集操作。

  • Nashorn引擎jjs:基於Nashorn引擎的命令行工具。它接受一些JavaScript源代碼為參數,並且執行這些源代碼。

  • 類依賴分析器jdeps:可以顯示Java類的包級別或類級別的依賴。

  • JVM的PermGen空間被移除:取代它的是Metaspace(JEP 122)。

Java 8是一次變化巨大的更新,耗費了工程師大量的時間,還借鑒了很多其它語言和類庫。我們無法在這裡一一詳細列舉,以後有機會一定給大家詳細解讀一下。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 度娘的思路 Action() { //實現1-2+3-4+5……+99-100的值 //20160802 int i,tag,sum; sum=0; tag=1; for(i=1;i<=100;i++) { sum+=i*tag; tag=-tag; } lr_output_message ("%d ...
  • 一、集群容錯 技術選型:hystrix。(就是上圖中熔斷器) 熔斷的作用: 第一個作用: 假設有兩台伺服器server1(假設可以處理的請求閾值是1W請求)和server2,在server1上註冊了三個服務service1、service2、service3,在server2上註冊了一個服務serv ...
  • windows-->preference-->myeclipse-->files and editors-->jsp 右側 Encoding 選擇 ISO 10646/Unicode(UTF-8)。 ...
  • 第一種:指定Method屬性(Action比較多) <!-- 聲明包 --> <package name="user" extends="struts-default"> <!-- 定義action --> <action name="first" class="com.sxt.action.Use ...
  • Java記憶體分配和回收的機制概括的說,就是:分代分配,分代回收。 對象將根據存活的時間被分為:年輕代(Young Generation)、年老代(Old Generation)、永久代(Permanent Generation,也就是方法區)。 java中每新new一個對象所占用的記憶體空間就是年輕代 ...
  • 一、IPython 簡介 IPython 是一個互動式的 Python 解釋器,而且它更加高效。 它和大多傳統工作模式(編輯 -> 編譯 -> 運行)不同的是, 它採用的工作模式是:執行 -> 探索 ,而大部分和數據分析相關的代碼都含有探索式操作(比如試誤法和迭代法),所以 IPython 能大大提 ...
  • Java中抽象類指的是,對一些具有公共屬性和行為的對象的一種高層次抽象,抽象類定義了一個“模板”,繼承它的子類只要實現自己的特有屬性和行為即可,因此,抽象類不可以被實例化。 Java中的介面,相當於抽象類的進一步抽象,給類定義一些固定不變的“行為”,類只需要去實現介面就可以享用特殊的操作了,Java... ...
  • ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...