楼主:
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才开始操作资料好处是确定原始资料到最终结果间要做什么才开始动手,可以减少不必要的中间资料、动作,建议看官方文件还有其他性质