您从未听说过的Java 8的10个功能
Lambdas lambdas lambdas。 這是您在談?wù)揓ava 8時(shí)所聽到的所有信息。但這只是一部分。 Java 8具有許多新功能-有些是功能強(qiáng)大的新類和習(xí)慣用語(yǔ),而另一些則是從一開始就應(yīng)該存在的功能。
我想介紹十個(gè)新功能,我認(rèn)為這些功能絕對(duì)是值得了解的小寶石。 您肯定會(huì)嘗試至少一兩個(gè),所以讓我們開始吧!
作為Java語(yǔ)言的新增功能,您現(xiàn)在可以將方法主體添加到接口中(稱為默認(rèn)方法 )。 這些方法隱式添加到實(shí)現(xiàn)該接口的每個(gè)類中。
這使您可以在不破壞代碼的情況下向現(xiàn)有庫(kù)添加功能。 這絕對(duì)是一個(gè)加號(hào)。 不利的一面是,這嚴(yán)重模糊了旨在用作合同的接口與用作其具體實(shí)現(xiàn)的類之間的界限。 在正確的地方,這可能是使界面更智能,避免重復(fù)并擴(kuò)展庫(kù)的一種優(yōu)雅方法。 如果使用不當(dāng),我們很快就會(huì)看到接口方法對(duì)此進(jìn)行查詢并將其轉(zhuǎn)換為具體類型。 顫抖…… 。
啟動(dòng)外部進(jìn)程是您要做的事情之一,半知道在進(jìn)程崩潰,掛起或消耗100%CPU時(shí)您將再次調(diào)試它。 現(xiàn)在,Process類提供了兩種新方法來(lái)幫助您控制不規(guī)則的過(guò)程。
第一個(gè)是isAlive() ,使您可以輕松檢查進(jìn)程是否仍在啟動(dòng)中,而不必等待它。 第二個(gè)功能更強(qiáng)大的是destroyForcfully() ,它使您可以強(qiáng)制終止已超時(shí)或不再需要的進(jìn)程。
現(xiàn)在,這里有些令人興奮的事情。 沒(méi)有人喜歡同步代碼。 這是降低應(yīng)用程序吞吐量(尤其是規(guī)模過(guò)小)的可靠方法,或者更糟糕的是,導(dǎo)致應(yīng)用程序掛起。 即使這樣,有時(shí)您還是別無(wú)選擇。
有很多習(xí)慣用法可以同步對(duì)資源的多線程訪問(wèn)。 最受尊敬的產(chǎn)品之一是ReadWriteLock及其關(guān)聯(lián)的實(shí)現(xiàn)。 這種習(xí)慣用法旨在通過(guò)允許多個(gè)線程消耗資源,同時(shí)僅阻止操縱該線程的線程來(lái)減少爭(zhēng)用。 從理論上講聽起來(lái)不錯(cuò),但實(shí)際上,這種鎖定是sloooow ,尤其是在具有大量編寫線程的情況下。
這太糟糕了,以至于Java 8引入了一個(gè)全新的RWLock,稱為StampedLock 。 這種鎖定不僅速度更快,而且還提供了用于樂(lè)觀鎖定的強(qiáng)大API,您可以以非常低的成本獲得閱讀器鎖定,希望在關(guān)鍵部分不會(huì)發(fā)生任何寫操作。 在本節(jié)的最后,您查詢鎖,以查看在此期間是否發(fā)生過(guò)寫入,在這種情況下,您可以決定是重試,升級(jí)鎖還是放棄。
此鎖是一個(gè)功能強(qiáng)大的工具,其本身值得一個(gè)完整的帖子。 我對(duì)這個(gè)新玩具感到興奮不已-做得好!
在這里補(bǔ)充閱讀。
對(duì)于從事多線程應(yīng)用程序的任何人來(lái)說(shuō),這都是另一個(gè)小寶。 一個(gè)簡(jiǎn)單高效的新API,用于從多個(gè)線程讀取和寫入計(jì)數(shù)器,其方式比使用AtomicIntegers還要快。 真是太酷了!
噢,NullPointers,所有Java開發(fā)人員的禍根。 也許是所有例外中最受歡迎的例外,這種情況自時(shí)間開始以來(lái)就已經(jīng)存在。 或至少是1965年 。
Java 8從Scala和Haskell借來(lái)的,有一個(gè)名為Optional的新模板,用于包裝可能為空的引用。 絕不是結(jié)束空值的靈丹妙藥,而是讓API設(shè)計(jì)人員在代碼級(jí)別(相對(duì)于文檔)表示可以返回空值或?qū)⒖罩祩鬟f給方法,并且調(diào)用者應(yīng)準(zhǔn)備為它。 因此,這僅適用于新的API,前提是調(diào)用者不讓引用轉(zhuǎn)義包裝程序,而該引用程序可能會(huì)被不安全地取消引用。
我必須說(shuō)我對(duì)此功能非常矛盾。 一方面,空值仍然是一個(gè)巨大的問(wèn)題,因此,我感謝在這方面所做的一切。 另一方面,我相當(dāng)懷疑這是否會(huì)成功。 這是因?yàn)椴捎肙ptional需要全公司范圍內(nèi)的持續(xù)努力,并且?guī)缀鯖](méi)有立即價(jià)值。 除非大力實(shí)施,否則這將留在路邊。
更多關(guān)于可選這里 。
Java語(yǔ)言的另一個(gè)小改進(jìn)是現(xiàn)在可以將注釋添加到代碼中的幾乎所有內(nèi)容中。 以前,注釋只能添加到類或方法聲明之類的內(nèi)容中。 使用Java 8時(shí),在將值轉(zhuǎn)換為特定類型的值時(shí),甚至在分配新對(duì)象時(shí),都可以將注釋添加到變量和參數(shù)聲明中。 這是集中精力的一部分(以及對(duì)Java doc工具和API的改進(jìn)),以使該語(yǔ)言對(duì)靜態(tài)分析和檢測(cè)工具(例如FindBugs)更加友好。 這是一個(gè)很好的功能,但是很像Java 7中引入的invokeDynamic一樣,它的真正價(jià)值將取決于社區(qū)對(duì)其的處理方式。
現(xiàn)在,這里有一系列方法 ,從一開始就應(yīng)該成為核心庫(kù)的一部分。 我最喜歡的一種愛(ài)好是,當(dāng)int超過(guò)2 ^ 32時(shí)調(diào)試數(shù)字溢出,然后繼續(xù)創(chuàng)建最討厭,最隨機(jī)的錯(cuò)誤(即“我是如何得到這個(gè)奇怪的值的?”)。
再一次,這里沒(méi)有靈丹妙藥,而是一組對(duì)數(shù)字進(jìn)行運(yùn)算的函數(shù),這些數(shù)字在溢出時(shí)以比您的標(biāo)準(zhǔn)+ / *運(yùn)算符隱式溢出的方式寬容的方式少。 如果要由我決定,我將把它作為JVM的默認(rèn)模式,并使用允許算術(shù)溢出的顯式函數(shù)。
長(zhǎng)期以來(lái),迭代目錄樹的內(nèi)容一直是??Google進(jìn)行的那些搜索之一(在這種情況下,您可能應(yīng)該使用Apache.FileUtils)。 Java 8為Files類提供了一種全新的外觀,其中包含十種新方法。 我最喜歡的一個(gè)是walk() ,它創(chuàng)建一個(gè)惰性流(對(duì)于大型文件系統(tǒng)很重要)以迭代目錄結(jié)構(gòu)的內(nèi)容。
如今不乏有關(guān)密碼和密鑰漏洞的討論。 編程安全性是一項(xiàng)棘手的事務(wù),容易出錯(cuò)。 這就是為什么我喜歡新的SecureRandom。 getinstanceStrong()方法自動(dòng)選擇最強(qiáng)大的JVM可用隨機(jī)生成器。 這減少了您無(wú)法獲得或默認(rèn)使用弱生成器的機(jī)會(huì),這會(huì)使密鑰和加密值更容易受到黑客攻擊。
Java 8引入了完整的新日期時(shí)間API 。 這是可以理解的,因?yàn)楝F(xiàn)有的不是很好。 實(shí)際上,Joda多年來(lái)一直是Java日期時(shí)間API的首選。 盡管如此,即使有了新的API,仍然存在一個(gè)大問(wèn)題–使用舊的API仍然有大量的代碼和庫(kù)。
我們都知道他們會(huì)留下來(lái)。 所以你會(huì)怎么做?
為此,Java 8做得非常漂亮,在Date類中添加了一個(gè)名為toInstant()的新方法,該方法將其轉(zhuǎn)換為新的API。 即使使用使用舊Date API的代碼(并且在可預(yù)見的將來(lái)仍會(huì)繼續(xù)使用),這使您可以快速跳轉(zhuǎn)到新API。
您是否認(rèn)為缺少任何功能,需要將其保留在此處,或者不同意我們的分析? 在評(píng)論部分讓我們知道–這就是它的作用!
翻譯自: https://www.javacodegeeks.com/2014/05/10-features-in-java-8-you-havent-heard-of.html
總結(jié)
以上是生活随笔為你收集整理的您从未听说过的Java 8的10个功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 锐龙9 3900XT参数评测大全
- 下一篇: 华为云服务必须用电脑版(华为云服务怎么用