nutshell_Nutshell中的Java 8语言功能-第2部分
nutshell
編者注:您也可以在此處檢查Part-1。
嗨,朋友,這是簡(jiǎn)明系列的Java 8語(yǔ)言功能的第2部分。
在這里,我們將討論Java 8的以下功能:
1.接口中的靜態(tài)方法
什么是靜態(tài)方法?
靜態(tài)方法是屬于類而不是對(duì)象或?qū)嵗姆椒ā?換句話說(shuō),這意味著該類的所有實(shí)例共享在靜態(tài)方法中定義的相同行為。 因此,您無(wú)需創(chuàng)建Class的實(shí)例或?qū)ο蠹纯烧{(diào)用靜態(tài)方法。
因此,如果靜態(tài)方法不需要調(diào)用對(duì)象,則將它們放在類中就沒(méi)有多大意義,因?yàn)轭愂菍儆谠擃惖乃袑?duì)象的藍(lán)圖。 那么,如果我們可以將所有靜態(tài)方法放在接口而不是類中呢? 好消息是,Java 8允許這樣做。 使用Java 8,我們可以將以前用來(lái)放置類的實(shí)用程序方法放入接口中。
接口中靜態(tài)方法的語(yǔ)法
語(yǔ)法與其他任何靜態(tài)方法一樣。
static <Return Type> <Method Name>();接口中靜態(tài)方法的主要目的
允許在接口中添加靜態(tài)方法的主要原因是在接口中而不是在類中具有實(shí)用程序方法。 在Java 8之前,如果我們要定義一些實(shí)用程序方法,我們將創(chuàng)建一個(gè)類并在該類中定義實(shí)用程序方法,因?yàn)槲覀冎绖?chuàng)建僅包含實(shí)用程序方法的類的對(duì)象是沒(méi)有意義的,因此我們?cè)跇?gòu)造函數(shù)將該類標(biāo)記為Private并將該類標(biāo)記為final,以使其無(wú)法繼承,因?yàn)槲覀冎漓o態(tài)方法不會(huì)被繼承,因此最好將其顯式標(biāo)記,以便僅查看該類就可以知道類不能被繼承。
接口中的靜態(tài)方法示例
在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是什么
流是源中支持聚合操作的一系列元素。 因此,每個(gè)流將有一個(gè)源和一個(gè)目的地。 數(shù)據(jù)通過(guò)Stream從源流向目標(biāo)。
以下Oracle文檔摘錄很好地描述了Collection和Stream之間的區(qū)別。
- 沒(méi)有存儲(chǔ) 。 流不是存儲(chǔ)元素的數(shù)據(jù)結(jié)構(gòu)。 相反,它通過(guò)一系列計(jì)算操作從數(shù)據(jù)結(jié)構(gòu),數(shù)組,生成器功能或I / O通道等源中傳遞元素。
- 本質(zhì)上是功能性的 。 對(duì)流的操作會(huì)產(chǎn)生結(jié)果,但不會(huì)修改其源。 例如,一種過(guò)濾Stream獲得從集合產(chǎn)生一個(gè)新的Stream ,而不過(guò)濾元件,而不是刪除從源收集元件。
- 懶惰 。 許多流操作(例如過(guò)濾,映射或重復(fù)刪除)可以延遲執(zhí)行,從而暴露出優(yōu)化的機(jī)會(huì)。 例如,“使用三個(gè)連續(xù)的元音查找第一個(gè)String ”不需要檢查所有輸入字符串。 流操作分為中間( Stream )操作和終端(產(chǎn)生值或副作用)操作。 中間操作總是很懶。
- 可能是無(wú)限的 。 盡管集合的大小是有限的,但流不是必需的。 諸如limit(n)或findFirst()類的短路操作可以允許對(duì)無(wú)限流的計(jì)算在有限時(shí)間內(nèi)完成。
- 易耗品 。 在流的生存期內(nèi),流的元素只能訪問(wèn)一次。 像Iterator一樣,必須生成新的流以重新訪問(wèn)源中的相同元素
Stream的語(yǔ)法
流可以通過(guò)多種方式創(chuàng)建。 我們將看到最常用的一種方法,并在另一篇文章中討論其他方法。
從上圖可以看出,在Collection接口中添加了新的默認(rèn)方法stream() ,并且List,Set和Queue接口擴(kuò)展了Collection接口,因此所有這些接口都具有stream方法,該方法可以用于從這些集合創(chuàng)建Stream作為源。
使用列表作為源創(chuàng)建字符串流的語(yǔ)法
List<String> list = new ArrayList<>(); list.add("AA");Stream<String> stream = list.stream();創(chuàng)建以Set為源的字符串流的語(yǔ)法
Set<String> set = new HashSet<>(); set.add("AA");Stream<String> stream = set.stream();流的主要目的
在Java中引入Stream API的主要目的是減少冗長(zhǎng)的代碼來(lái)對(duì)諸如Collections,Array之類的一組數(shù)據(jù)執(zhí)行操作,并利用多核處理器(使用并行流)而無(wú)需程序員編寫一行多線程代碼,從而提高了性能。
流操作示例
假設(shè)您有一個(gè)元素列表(字符串),并且想要一個(gè)不同的元素列表。 接下來(lái),我們將看到您將如何在Java 8之前和Java 8上進(jìn)行操作。
在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,可對(duì)Collection進(jìn)行操作的代碼更像是查詢,而不是很多樣板代碼。 就像在SQL中一樣,我們不需要編寫邏輯來(lái)從elements.Sql集合中查找最大值,Sql為此提供了max()函數(shù)。 同樣,Java 8流提供了許多聚合函數(shù),我們也可以將它們鏈接在一起以在一行中完成多項(xiàng)任務(wù)。 這種方法的優(yōu)點(diǎn)是該代碼不太冗長(zhǎng),并且還使用了多核處理器,因此也提高了性能。
參考文獻(xiàn):
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
總結(jié)
以上是生活随笔為你收集整理的nutshell_Nutshell中的Java 8语言功能-第2部分的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: kafka grpc_模型服务:流处理与
- 下一篇: 金蝶K3有一台客户端连不上服务器(金蝶k