Stream流是Java8 API推出的新特性,极大的简化了我们遍历集合和筛选集合的操作,但是初次使用时极有可能出现错误。
下面的代码按照常理来说看似是没有错误:
public class StreamTwo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张无忌");
list.add("周芷若");
list.add("赵敏");
list.add("张强");
list.add("张三丰");
//获取Stream流
Stream<String> stream = list.stream();
//执行过滤 遍历操作
stream.filter((a)->a.startsWith("张"))
.forEach((a)->System.out.println(a));
//过滤之后的个数
long count = stream.count();
System.out.println(count);
}
}
但是点击运行后控制台报出错误:
错误出现的原因: Stream API只能被消费一次,后续重复使用已建立的流会报异常!所以stream流是线程安全的!
解决方法: 创建一个新的Stream流 ,使用不同的Stream流 来执行遍历操作 和得到 当前流中的元素个数。
添加代码:
//获取一个新的Stream流
Stream<String> streamTwo = list.stream();
//过滤之后的个数
long count =streamTwo.filter((a)->a.startsWith("张")).count();
System.out.println(count);
成功运行结果: