作者Tverous (Orah~)
看板java
標題[問題] Stream lazy evaluation詢問
時間Sat May 27 10:17:37 2017
最近在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