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