作者:
Tverous (Orah~)
2017-05-27 10:17:37最近在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
請教各位前輩 感謝
作者:
ssccg (23)
2017-05-27 10:26:00不是沒有執行,是不會對Stream中的資料操作,只是先把要做的動作存下來而已lines執行完: Stream(檔名, 動作1: 依序讀取)filter執行完: Stream(檔名, 1:依序讀取, 2:只留符合條件)findFirst執行時,因為是short-circuiting terminal動作執行:開檔→依序(讀一行→符合條件才有值→有值就結束回傳)Stream API都會分是intermediate、terminal operationintermediate都是存要做的動作,到terminal才開始操作資料好處是確定原始資料到最終結果間要做什麼才開始動手,可以減少不必要的中間資料、動作,建議看官方文件還有其他性質