[問題] Stream lazy evaluation詢問

看板java作者 (Orah~)時間8年前發表 (2017/05/27 02:17), 8年前編輯推噓0(0011)
留言11則, 2人參與, 最新討論串1/1
最近在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

05/27 10:26, , 1F
不是沒有執行,是不會對Stream中的資料操作,只是先把要做
05/27 10:26, 1F

05/27 10:26, , 2F
的動作存下來而已
05/27 10:26, 2F

05/27 10:31, , 3F
lines執行完: Stream(檔名, 動作1: 依序讀取)
05/27 10:31, 3F

05/27 10:33, , 4F
filter執行完: Stream(檔名, 1:依序讀取, 2:只留符合條件)
05/27 10:33, 4F

05/27 10:48, , 5F
findFirst執行時,因為是short-circuiting terminal動作
05/27 10:48, 5F

05/27 10:50, , 6F
執行:開檔→依序(讀一行→符合條件才有值→有值就結束回傳)
05/27 10:50, 6F

05/27 10:52, , 7F
Stream API都會分是intermediate、terminal operation
05/27 10:52, 7F

05/27 10:53, , 8F
intermediate都是存要做的動作,到terminal才開始操作資料
05/27 10:53, 8F

05/27 10:58, , 9F
好處是確定原始資料到最終結果間要做什麼才開始動手,可以
05/27 10:58, 9F

05/27 11:00, , 10F
減少不必要的中間資料、動作,建議看官方文件還有其他性質
05/27 11:00, 10F

05/27 12:42, , 11F
原來如此 非常感謝協助
05/27 12:42, 11F
文章代碼(AID): #1PAE73yw (java)
文章代碼(AID): #1PAE73yw (java)