Stream是java8新加入的API,以前项目中都没有用到,最近新接触的项目用了很多。
Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作,或者大批量数据操作 。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性.
具体的描述我就不打字了,嫌麻烦,有兴趣的可以去找度娘,只是上代码试例
之前代码中,对各种集合数据的处理,包括循环,过滤等都是常规的for循环或者迭代器迭代等,自我感觉哈,以前的这种代码可读性高一点,基本一眼就会看出原编程人员想要干什么,但是代码非常多,不美观,显得不高大上。。。手动笑脸。。。。
private List<Student> doFilter(List<Student> list ,String keyWord){
return list.stream().filter(x->{
Boolean nameMatch=(null!=x.getName()?x.getName().contains(keyWord):Boolean.FALSE);
Boolean idMatch=(null!=x.getId()?x.getId().contains(keyWord):Boolean.FALSE);
Boolean sexMatch=(null!=x.getSex()?x.getSex().contains(keyWord):Boolean.FALSE);
return (nameMatch||idMatch||sexMatch);
}).collect(toList());
}
上面是Steam的filter操作,十分好用,可以过滤出你想要的数据;
这里提一点,Steam分为并行流和串行流,上面的例子是串行流,适合单线程,如果数据量大的情况下会出现问题,这时候保证线程安全情况下,用并行流更好。
- default Stream stream() : 返回串行流
- default Stream parallelStream() : 返回并行流
private List<Student> doFilter(List<Student> list ,String keyWord){
CopyOnWriteArrayList<Student> newList=new CopyOnWriteArrayList<>(list);
return newList.parallelStream().filter(x->{
Boolean nameMatch=(null!=x.getName()?x.getName().contains(keyWord):Boolean.FALSE);
Boolean idMatch=(null!=x.getId()?x.getId().contains(keyWord):Boolean.FALSE);
Boolean sexMatch=(null!=x.getSex()?x.getSex().contains(keyWord):Boolean.FALSE);
return (nameMatch||idMatch||sexMatch);
}).collect(toList());
这里用线程安全的集合。stream()和parallelStream()方法它们在功能的使用上是没差别的。差别就是单线程和多线程的执行。
反正,现在对于集合类的处理,用stream和Lambda表达式用的很爽,以前没尝试过,熟悉后用上了就停不下来了,像limit,peek,sorted,forEach等操作经常用到,加上Lambda表达式就很简洁。
这里再提一下,如果用了stream的遍历的话,同一个流是只能遍历一次的,不能像下面的操作
Stream<Student> studentStream=list.stream();
studentStream.forEach(x->{doSomething});
studentStream.forEach(x->{doSomething});
这里面简单记录下,想学更多Stream的api可以查阅官方文档。