Java 8 Friday Goodies:新的新I / O API
在Data Geekery ,我們喜歡Java。 而且,由于我們真的很喜歡jOOQ的流暢的API和查詢DSL ,我們對(duì)Java 8將為我們的生態(tài)系統(tǒng)帶來(lái)什么感到非常興奮。 我們已經(jīng)寫(xiě)了一些關(guān)于Java 8好東西的博客 ,現(xiàn)在我們覺(jué)得是時(shí)候開(kāi)始一個(gè)新的博客系列了……
Java 8星期五
每個(gè)星期五,我們都會(huì)向您展示一些不錯(cuò)的教程風(fēng)格的Java 8新功能,這些功能利用了lambda表達(dá)式,擴(kuò)展方法和其他好東西。 您可以在GitHub上找到源代碼 。
Java 8 Goodie:新的新I / O API
在本系列的上一篇博客文章中 ,我們主要通過(guò)幫助您將java.io.FileFilter實(shí)例表示為lambda表達(dá)式,展示了Java 8的lambda表達(dá)式如何在現(xiàn)有(但已過(guò)時(shí))的JDK 1.2 I / O API上進(jìn)行改進(jìn)。
許多讀者正確地指出,許多java.io API已被Java 7的java.nio API取代,其中“ N”代表“ New” (我知道。New.Old.Old-2.Old- 2-FIXME。Old-2-TODO ...)。 但是Java 8的情況甚至更好。我們將其稱為New New I / O API(NNIO),盡管jOOQ社區(qū)成員建議將其稱為“ Enterprise IO”:
@ lukaseder @ brunoborges @ ponzao為“企業(yè)IO” +1(在這種情況下,當(dāng)然不能正常工作)— Franz van Betteraey(@FrVaBe) 2014年1月15日
回到更具建設(shè)性的博客。 讓我們走一小段路程(打算用雙關(guān)語(yǔ),請(qǐng)參見(jiàn)Files.walk() ),了解改進(jìn)的Java 8 NIO功能。 首先讓我們看看java.nio.Files中的新方法。 實(shí)際上,我們終于可以列出Path的內(nèi)容了,這真是太棒了! 在Java 8中,我們將使用新引入的Files.list() ,它返回文件的惰性流:
Files.list(new File(".").toPath()).forEach(System.out::println);我得到的輸出是這樣的:
.\.git .\.gitignore .\.idea .\java8-goodies.iml .\LICENSE.txt .\pom.xml .\README.txt .\src .\target請(qǐng)記住, forEach()是“終端方法” ,即使用流的方法。 您不得在此類Stream上調(diào)用任何其他方法。
我們還可以跳過(guò)所有隱藏文件,僅列出前三個(gè)“常規(guī)”文件,如下所示:
Files.list(new File(".").toPath()).filter(p -> !p.getFileName().toString().startsWith(".")).limit(3).forEach(System.out::println);我得到的新輸出是這個(gè):
.\java8-goodies.iml .\LICENSE.txt .\pom.xml現(xiàn)在,這已經(jīng)非常棒了。 會(huì)好起來(lái)嗎? 是的,它可以。 您還可以使用新的Files.walk()方法進(jìn)入目錄,從而“遍歷”整個(gè)文件層次結(jié)構(gòu)。 就是這樣:
Files.walk(new File(".").toPath()).filter(p -> !p.getFileName().toString().startsWith(".")).forEach(System.out::println);不幸的是,上面的方法將創(chuàng)建一個(gè)路徑流,其中不包括所有隱藏的文件和目錄,但是它們的后代仍然被列出。 這樣我們得到:
Omitted: .\.gitBut listed: .\.git\COMMIT_EDITMSG .\.git\config .\.git\description [...]很容易理解為什么會(huì)這樣。 Files.walk()返回所有后代文件的(惰性)流。 對(duì).filter()的調(diào)用將刪除從Stream中隱藏的那些,但這對(duì)可能適用于walk()實(shí)現(xiàn)的任何遞歸算法沒(méi)有影響。 坦白說(shuō),這有點(diǎn)令人失望。 我們不能利用Java 7的Files.walkFileTree()方法,因?yàn)榻邮盏腇ileVisitor類型不是@FunctionalInterface
但是,我們可以使用以下瑣碎的邏輯來(lái)無(wú)效率地解決此限制:
Files.walk(new File(".").toPath()).filter(p -> !p.toString().contains(File.separator + ".")).forEach(System.out::println);現(xiàn)在產(chǎn)生預(yù)期的
. .\java8-goodies.iml .\LICENSE.txt .\pom.xml .\README.txt .\src .\src\main .\src\main\java .\src\main\java\org .\src\main\java\org\jooq [...]不過(guò),好消息是新的Files.lines()方法。 以下示例顯示了我們?nèi)绾屋p松地從文件中逐行讀取,修剪每行(刪除縮進(jìn))并過(guò)濾出空行:
Files.lines(new File("pom.xml").toPath()).map(s -> s.trim()).filter(s -> !s.isEmpty()).forEach(System.out::println);以上收益:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.jooq</groupId> <artifactId>java8-goodies</artifactId> <version>1.0-SNAPSHOT</version> [...]結(jié)論
顯然,惰性評(píng)估的概念會(huì)在社區(qū)中引起大量混亂,類似于Stream只能使用一次的事實(shí)。 我們敢打賭, Java 8 Streams API將成為新的Stack Overflow問(wèn)題的唯一最大來(lái)源。
盡管如此, Streams API仍然很棒 ,下周在Java 8 Friday系列上,我們將看到如何利用lambda表達(dá)式和Streams 對(duì)事物進(jìn)行排序 ,然后再了解Java 8將如何改善數(shù)據(jù)庫(kù)交互!
翻譯自: https://www.javacodegeeks.com/2014/01/java-8-friday-goodies-the-new-new-io-apis.html
總結(jié)
以上是生活随笔為你收集整理的Java 8 Friday Goodies:新的新I / O API的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 金蝶软件园7楼(金蝶国际软件集团有限公司
- 下一篇: 红米root权限在哪设置(红米手机如何设