看板 java 關於我們 聯絡資訊
最近在Java8 技術手冊中看到Java8新的應用 在以下的程式碼中 作者講解說: 程式片段的lines()方法實際上沒有進行任何一行的讀取,filter()也沒有作任何 一行的過濾,直到呼叫findFirst()時,filter()指定的條件才會真正去執行,而此時才 會要求lines()傳回的Stream進行第一行讀取,如果第一行就符合,那後續的行就不會再 讀取 String fileName = args[0]; String prefix = args[1]; Optional<String> firstMatchdLine = Files.lines(Paths.get(fileName)) .filter(line -> line.startsWith(prefix)) .findFirst(); System.out.println(firstMatchdLine.orElse("no matched line")); 不太懂作者說方法不會執行直到findFirst()的意思,這段程式碼不是就從一開始就開始執 行嗎?,然後遇到正確結果就馬上跳出,所以才會比for迴圈似的外部迭代效率好 附上作者詳細解說 https://openhome.cc/Gossip/Java/Stream.html 請教各位前輩 感謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.115.135.195 ※ 文章網址: https://www.ptt.cc/bbs/java/M.1495851459.A.F3A.html ※ 編輯: Tverous (59.115.135.195), 05/27/2017 10:18:50
ssccg: 不是沒有執行,是不會對Stream中的資料操作,只是先把要做 05/27 10:26
ssccg: 的動作存下來而已 05/27 10:26
ssccg: lines執行完: Stream(檔名, 動作1: 依序讀取) 05/27 10:31
ssccg: filter執行完: Stream(檔名, 1:依序讀取, 2:只留符合條件) 05/27 10:33
ssccg: findFirst執行時,因為是short-circuiting terminal動作 05/27 10:48
ssccg: 執行:開檔→依序(讀一行→符合條件才有值→有值就結束回傳) 05/27 10:50
ssccg: Stream API都會分是intermediate、terminal operation 05/27 10:52
ssccg: intermediate都是存要做的動作,到terminal才開始操作資料 05/27 10:53
ssccg: 好處是確定原始資料到最終結果間要做什麼才開始動手,可以 05/27 10:58
ssccg: 減少不必要的中間資料、動作,建議看官方文件還有其他性質 05/27 11:00
Tverous: 原來如此 非常感謝協助 05/27 12:42