惰性求值<br>
仅仅是对流需要执行的操作的描述,并不会立即执行<br>返回值是stream<br>
例如过滤操作filter
及早求值
从stream产生新值的方法,会导致stream的迭代<br>返回值是非stream或空<br>
例如计数操作count
针对如下例子:<br>List<String> strings = ...;<br>long emptyStrCount = <font color="#8a8b8f">strings</font><br> .<font color="#f15a23">stream()</font><font color="#0076b3"><br> .filter(<font color="#662c90">str -> !str.isEmpty()</font>)<br> </font>.<font color="#16884a">count()</font>;
strings为一个字符串列表,对其中为空的字符串进行计数
通过stream()方法获取集合的可操作stream流
filter方法接受一个一元谓词函数(Predicate<String>),并依据返回的boolean值决定断言的元素是否保留到过滤后的stream中<br>filter操作并不会立即执行,它仅仅描述需要对strings.stream()这个流对象需要执行的操作<br>
最后count方法对过滤后的stream进行元素计数,获得最终结果
如果修改为<br>strings.stream().filter(str -> {<br> System.out.println(str);<br> return str.isEmpty();<br> });<br>此代码执行后并不会有任何输出,因为filter方法不会构造一个新的列表,不会立即迭代列表,<br>并且此stream没有及早求值方法,因此不会进行迭代,即filter方法不会被执行<br>