java8的新特性_Java8的
java8的新特性
Java8沒有安排釋放,直到2014年3月,但早期發行版本已經可用了一段時間。 一些最有趣的新功能是:
- 流
- 功能接口
- 默認方法
- Lambdas
- Java時間
流
新的java.util.stream軟件包包含“支持元素流上的功能樣式操作的類”。 流不是一種新的集合,并且不替換任何現有的集合,例如列表和隊列。 相反,它們提供了一種與現有集合進行交互的方式,并且在這方面與迭代器更相似。
javadocs將流描述為“支持順序和并行聚合操作的元素序列”。 流管道由產生結果(例如,總和或計數)的源(例如,集合),中間操作(例如,過濾器或映射)和終端操作組成。 流是惰性的,因為對數據的操作僅在最后一分鐘(即,在調用終端操作時)執行,并且流僅處理一次。
例如:
int totalFxTrading = blocks.stream().filter(trade -> trade.getType() == FX).mapToInt(b -> b.getTradedAmount()).sum();功能接口
Java 8將具有稱為功能接口的新功能。 功能接口只有一種抽象方法。 您可能已經將許多這樣的接口用作Java開發人員,例如Runnable,ActionListener,Comparator和Callable。 在Java 8中,這些類型的接口現在更正式地稱為功能接口。 可以使用新的@FunctionalInterface批注來標識它們,最重要的是,可以使用Lambda表達式(稍后再介紹)來表示它們。 例如,過去要使用ActionListener,需要創建一個實現,通常使用匿名內部類。
例如:
JButton button = new JButton();button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent ae) {System.out.println(ae.getSource());}});使用功能接口,這變得更加簡單:
JButton myButton = new JButton();button.addActionListener(ae -> {System.out.println("You clicked the button");});我們甚至不需要提及ActionEvent –編譯器從上下文中得出“ ae”的類型。 請注意, @ FunctionalInterface批注(如@Override批注)不是必需的。 相反,它向編譯器發出信號,表明您的意圖,以便在某些地方出現問題(例如多個抽象方法可用)時向您發出警告。
默認方法
在Java7之前,接口是相當簡單的事情。 它只能包含必須由具體子類實現的抽象方法(和常量)。 接口基本上是一堆方法簽名,但是永遠不能包含方法定義/實現。
在Java8中,事情變得更加有趣。 現在可以將默認方法添加到接口。 這些是具有實現的方法,不必在接口實現中重寫,并且可以直接從接口運行。
添加這些默認方法是為了提供向后兼容性。 如果未添加它們,則例如在不破壞所有實現的情況下就不可能擴展/改善現有的收集接口。 因此,由于這個原因,默認方法有時稱為防御者方法。
對我來說,默認方法的真正有趣之處在于它們允許多種形式的繼承。 由于一個類可以實現多個接口,并且每個接口現在都可以具有一個具有相同名稱的默認方法,因此該子類可以繼承哪個版本? 我認為這被稱為鉆石問題 。 如果在使用Java8時出現這種情況,編譯器將提供警告。 您可以使用語法X.super.m(…)顯式選擇父類的實現之一。
附帶說明一下,為什么這些新的默認方法完全需要default關鍵字? 如果沒有該關鍵字,他們是否也能正常工作? 答案是肯定的,默認關鍵字是多余的,就像抽象關鍵字一樣。 兩者都被添加以使事情更加清晰。 這篇文章有一些更多的細節是鏈接。
拉姆達
根據Wikipedia的說法,lambda表達式是“定義為不綁定標識符的函數”。 Lambda表達式已進入Java版本,旨在簡化代碼。
我上面討論的許多其他更改(默認方法,功能接口)與引入lambas密切相關。
編寫Lambda表達式時,它將在編譯時轉換為功能接口。 這是一個使用Lambda表達式用更簡潔易讀的代碼替換匿名內部類的示例。
沒有Lambda的舊方法:
Lambda的新方法:
button.addActionListener(e -> {System.out.println(“Action Detected”);});使用Lambda表達式通常會使代碼更易于閱讀,并且所需的行數更少。
Java時間
用Java處理日期和時間從來都不是理想的。 充其量,它是古怪的,而最糟的是,它是一場噩夢。 Date類很笨重,現在已被不推薦使用的方法所困擾。 Calendar類是一種改進,但是我個人似乎總是花更多的時間來瀏覽API文檔,即使我以前做過這些事情。 其他第三方圖書館則嘗試以更簡潔的方式處理時間(例如,喬達時間)。 有傳言說Java8和Java8改進了Java itslef和anf的處理,這就是java.time包。
一個新的(抽象)Clock類提供了一些有用的靜態方法,例如systemUTC()和systemDefaultZone()來獲取當前時間和時區。 并且許多新類(例如LocalDate和LocalTime以及YearMonth和MonthDay)提供了更為優雅的日常(對雙關語)日期操作。
可以在JSR-310站點上找到更多詳細信息。
Java8中沒有的內容
在一個側面說明,雖然日期/時間的處理將在Java8得到改善,令人驚訝的還有沒有好的辦法來處理貨幣的Java(東西我已經在博客 ,在過去)。 雙打(以及所有浮點數)天生就不適合花錢,或者需要精確計算的任何地方。 使用int或long需要跟蹤小數點,BigDecimal也不理想。 JSR-354可能會有所改進,但看起來我們必須等到Java 9才能完成。
翻譯自: https://www.javacodegeeks.com/2013/10/java8.html
java8的新特性
總結
以上是生活随笔為你收集整理的java8的新特性_Java8的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓平板排行榜2022(安卓平板排行榜)
- 下一篇: 记录更新(Java数据类)