作者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://webptt.com/cn.aspx?n=bbs/java/M.1495851459.A.F3A.html
※ 编辑: Tverous (59.115.135.195), 05/27/2017 10:18:50
1F:→ ssccg: 不是没有执行,是不会对Stream中的资料操作,只是先把要做 05/27 10:26
2F:→ ssccg: 的动作存下来而已 05/27 10:26
3F:→ ssccg: lines执行完: Stream(档名, 动作1: 依序读取) 05/27 10:31
4F:→ ssccg: filter执行完: Stream(档名, 1:依序读取, 2:只留符合条件) 05/27 10:33
5F:→ ssccg: findFirst执行时,因为是short-circuiting terminal动作 05/27 10:48
6F:→ ssccg: 执行:开档→依序(读一行→符合条件才有值→有值就结束回传) 05/27 10:50
7F:→ ssccg: Stream API都会分是intermediate、terminal operation 05/27 10:52
8F:→ ssccg: intermediate都是存要做的动作,到terminal才开始操作资料 05/27 10:53
9F:→ ssccg: 好处是确定原始资料到最终结果间要做什麽才开始动手,可以 05/27 10:58
10F:→ ssccg: 减少不必要的中间资料、动作,建议看官方文件还有其他性质 05/27 11:00
11F:→ Tverous: 原来如此 非常感谢协助 05/27 12:42