John Jiang

          a cup of Java, cheers!
          https://github.com/johnshajiang/blog

             :: 首頁 ::  :: 聯(lián)系 :: 聚合  :: 管理 ::
            131 隨筆 :: 1 文章 :: 530 評論 :: 0 Trackbacks
          Java流的8個特性
          本文是稍早前java.net推薦的一篇博文,描述了Java流的8個有用的特性。(2014.03.07最后更新)

          Lamba表達式是Java8到目前為止最棒的特性。但我認(rèn)為有一個秘密武器展示了Lambda這一"語法糖"在提高代碼可讀性和可寫性方面是何其的強大。當(dāng)你在改進代碼的表現(xiàn)力時,那么在對代碼的理解方面你就上升到了新的境界,這能使最笨拙的工作變得簡單。

          是什么秘密武器呢?就是Java Stream API。最近我參與了一個在線比賽,就是在一個對性能要求較高的環(huán)境中簡單地使用Java Stream。令我驚訝的是,這個API讓編寫主要的循環(huán)程序變得十分簡單,而且能很好地適應(yīng)我所做出的眾多變化。下面就是我所學(xué)到的8個特性。

          1. Java流不需要Lambda表達式
          盡管這個API確實從Lambda表達式中獲準(zhǔn)良多,但你并不必非得使用Lambda。你可以回過去使用匿名內(nèi)部類,但為什么要這么做呢?較可能的場景是,使用一個方法引用(例如Integer::valueOf),或者一個實例對象。使用方法引用可將復(fù)雜的多行邏輯置于循環(huán)體之外,就如你在優(yōu)化一個hash set查找時所看到的。而實例對象可用于實現(xiàn)"四人幫"的策略模式。但請不要使用匿名內(nèi)部類,除非你不得不這么做。

          2. 窺入流內(nèi)進行調(diào)試
          你可以在流的任何位置放入你所想加進去的媒質(zhì),這個媒質(zhì)稱為peek。該操作使用了一個消費者對象,并期望不產(chǎn)生任何結(jié)果,因為Lambda一般只返回空。我喜歡把peek用于向系統(tǒng)發(fā)送調(diào)試信息,就如
          .peek(System.out::println)
          .peek(it 
          -> System.out.printf("it is %s%n", it)

          3. 流化隨機成員
          流并不局限于集合或數(shù)組,甚至是固定鏈表。如果你能創(chuàng)建一個Iterator或Supplier Lambda來創(chuàng)建流中的值,然后你就可以使用類java.util.stream.StreamSupport中的方法來創(chuàng)建一個流了??梢栽O(shè)想一個使用持續(xù)測量值,如內(nèi)存消耗量或網(wǎng)絡(luò)吞量,來驅(qū)動的流。

          4. 流化隨機數(shù)
          如果你正在尋找一個簡單的隨機數(shù),例如可以通過java.util.Random,這個類現(xiàn)在有了三個新的set方法ints(),longs()和doubles()來創(chuàng)建流。這些方法的重載版本可以讓你設(shè)置邊界,隨機種子以及流中隨機數(shù)的總量。

          5. 流化I/O Reader
          Java程序員的另一個常見工作就是一行一行地解析文件?,F(xiàn)在java.io.BufferedReader有了一個新方法lines(),它會將I/O流轉(zhuǎn)化為一個字符串流,以便于流的處理。

          6. 流化文件樹
          如果訪問的文件并不是你的菜,那就試試訪問一個文件樹會怎么樣?類java.nio.file.Files中有幾個方法都可以返回流。list()方法將列出一個目錄下的所有文件,walk()方法將會遞歸地做到這一點,而filter()方法也會遞歸地訪問這些文件,但會使用一些屬性來進行過濾(當(dāng)你有一個Path對象,有些事情會變得復(fù)雜起來)。你依然可以使用lines(Path)方法來通過流去獲取內(nèi)容。

          7. 流化復(fù)雜文本
          如果你依然念念不忘文本處理,但內(nèi)容并不是基于行,那么就可以在java.util.regex.Pattern實例中使用splitAsStream(CharSequence)方法。這對于處理有數(shù)百萬列的CSV文件或CLASSPATH十分有用。

          8. 流化ZIP文件
          說到對長CLASSPATH的搜索,你也可以很簡單地調(diào)用名為stream的方法來流化java.util.zip.ZipFiles和java.util.jar.JarFiles,它會相應(yīng)地返回一個ZipEntry或JarEntry實例。

          如果你都已經(jīng)干過這些事了,那么你肯定知道它們并不是Java流的基本用途。不過將來會有足夠多的博文去涉及Java流的基礎(chǔ)。我只是認(rèn)為上述這些都是被掩藏起來的寶藏,它們揭示了Java流的潛質(zhì)。
          posted on 2014-02-28 15:25 John Jiang 閱讀(1024) 評論(0)  編輯  收藏 所屬分類: JavaSE 、Java 、翻譯
          主站蜘蛛池模板: 镇宁| 兴安县| 田东县| 九龙城区| 长岭县| 股票| 桐梓县| 广水市| 石家庄市| 安顺市| 尼勒克县| 莱州市| 卓资县| 襄樊市| 北海市| 布尔津县| 富阳市| 鹿邑县| 梅州市| 博爱县| 常德市| 商河县| 淮北市| 凭祥市| 宜章县| 开平市| 宁波市| 武强县| 吕梁市| 图木舒克市| 玉田县| 共和县| 盐亭县| 兴安盟| 东源县| 依安县| 太康县| 康马县| 黄大仙区| 江门市| 九龙坡区|