Nutshell中的Java 8语言功能-第2部分
編者注:您也可以在此處檢查Part-1。
嗨,朋友們,這是簡明系列的Java 8語言功能的第2部分。
在這里,我們將討論Java 8的以下功能:
1.接口中的靜態方法
什么是靜態方法?
靜態方法是屬于類而不是對象或實例的方法。 換句話說,這意味著該類的所有實例共享在靜態方法中定義的相同行為。 因此,您無需創建Class的實例或對象即可調用靜態方法。
因此,如果靜態方法不需要調用對象,則將它們放在類中就沒有多大意義,因為類是屬于該類的所有對象的藍圖。 那么如果我們可以將所有靜態方法放在接口而不是類中呢? 好消息是,Java 8允許這樣做。 使用Java 8,我們可以將以前用來放置類的實用程序方法放入接口中。
接口中靜態方法的語法
語法與其他任何靜態方法一樣。
static <Return Type> <Method Name>();接口中靜態方法的主要目的
允許在接口中添加靜態方法的主要原因是在接口中而不是在類中具有實用程序方法。 在Java 8之前,如果我們要定義一些實用程序方法,那么我們將創建一個類并在該類中定義實用程序方法,因為我們知道創建僅包含實用程序方法的類的對象是沒有意義的,因此我們正在構造構造函數該類的名稱為Private,并將該類標記為final,以使其無法繼承,因為我們知道靜態方法不會被繼承,因此最好將其顯式標記,以便僅查看該類就可以知道類不能被繼承。
接口中的靜態方法示例
在Java 8之前
final class CustomerUtil {private CustomerUtil(){}public static Date convertDateFormat(){}public static String appendData() {} } class Test {public static void main(String[] args){CustomerUtil.convertDateFormat(); } }Java 8之后
interface CustomerUtil {public static Date convertDateFormat(){}public static String appendData() {} } class Test { public static void main(String[] args){CustomerUtil.convertDateFormat(); } }2.流
Java 8中的Stream是什么
流是源中支持聚合操作的一系列元素。 因此,每個流將有一個源和一個目的地。 數據通過Stream從源流向目標。
下面的Oracle文檔摘錄很好地描述了Collection和Stream之間的區別。
- 沒有存儲 。 流不是存儲元素的數據結構。 相反,它通過一系列計算操作從數據結構,數組,生成器功能或I / O通道等源中傳遞元素。
- 本質上是功能性的 。 對流的操作會產生結果,但不會修改其源。 例如,一種過濾Stream獲得從集合產生一個新的Stream ,而不過濾元件,而不是刪除從源收集元件。
- 懶惰 。 許多流操作(例如過濾,映射或重復刪除)可以延遲實施,從而暴露出進行優化的機會。 例如,“使用三個連續的元音查找第一個String ”不需要檢查所有輸入字符串。 流操作分為中間( Stream )操作和終端(產生值或副作用)操作。 中間操作總是很懶。
- 可能是無限的 。 盡管集合的大小是有限的,但流不是必需的。 諸如limit(n)或findFirst()類的短路操作可以允許對無限流的計算在有限時間內完成。
- 易耗品 。 在流的生存期內,流的元素只能訪問一次。 像Iterator一樣,必須生成新的流以重新訪問源中的相同元素
Stream的語法
流可以通過多種方式創建。 我們將看到最常用的一種方法,并在另一篇文章中討論其他方法。
從上圖可以看出,在Collection接口中添加了新的默認方法stream() ,并且List,Set和Queue接口擴展了Collection接口,因此所有這些接口都具有stream方法,該方法可以用于從這些集合中創建Stream作為源。
使用列表作為源創建字符串流的語法
List<String> list = new ArrayList<>(); list.add("AA");Stream<String> stream = list.stream();創建以Set為源的字符串流的語法
Set<String> set = new HashSet<>(); set.add("AA");Stream<String> stream = set.stream();流的主要目的
在Java中引入Stream API的主要目的是減少冗長的代碼來對諸如Collections,Array之類的一組數據執行操作,并利用多核處理器(使用并行流)而無需程序員編寫一行多線程代碼,從而提高了性能。
流操作示例
假設您有一個元素列表(字符串),并且想要一個不同的元素列表。 接下來,我們將看到您將如何在Java 8之前和Java 8上做到這一點。
在Java 8之前
List<String> list = new ArrayList<>(); list.add("AA"); list.add("BB"); list.add("BB"); list.add("BB"); System.out.println("Size of list before applying distinct logic:"+list.size()); List<String> distinctList1 = new ArrayList<String>(); for(String str : list){if(!distinctList1.contains(str)){distinctList1.add(str);} } System.out.println("Distinct List Size:"+ distinctList1.size());Java 8之后
List<String> sourceList = new ArrayList<>(); sourceList.add("AA"); sourceList.add("BB"); sourceList.add("BB"); sourceList.add("BB"); System.out.println("Size of list before applying Stream Operations:"+sourceList.size()); List<String> distinctList = sourceList.stream().distinct().collect(Collectors.toList()); System.out.println("Distinct List Size:"+ distinctList.size());在上面的代碼中, sourceList是Stream distinct()的元素源, Stream distinct()和collect()是流操作。 distinctList是destinition列表。
從上面的示例可以看出,使用Java 8,可對Collection進行操作的代碼更像是查詢,而不是很多樣板代碼。 就像在SQL中一樣,我們不需要編寫邏輯來從elements.Sql集合中查找最大值,而Sql為此提供了max()函數。 同樣,Java 8流提供了許多聚合函數,我們也可以將它們鏈接在一起以在一行中完成多項操作。 這種方法的優點是該代碼不太冗長,并且還利用了多核處理器,因此也提高了性能。
參考文獻:
https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html
http://www.oracle.com/technetwork/articles/java/ma14-java-se-8-streams-2177646.html
翻譯自: https://www.javacodegeeks.com/2018/07/java-8-language-features-part-2.html
總結
以上是生活随笔為你收集整理的Nutshell中的Java 8语言功能-第2部分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不卑不亢下一句是什么 关于不卑不亢的下一
- 下一篇: 鬼子姜的禁忌 鬼子姜的禁忌有哪些