Java8stream流学习记录一
我相信大多数地方都能看到stream的详解,此篇文章仅为博主自己学习的时候对照翻译记录,以方便日后记不住的时候回来再看看.
- Stream
返回一个以此集合作为源的顺序Stream 。
当spliterator()方法无法返回IMMUTABLE 、 CONCURRENT或late-binding的spliterator()时,应覆盖此方法。 (有关详细信息,请参阅spliterator() 。)
返回:
此集合中元素的顺序Stream
实现:
默认实现从集合的Spliterator创建一个顺序Stream 。
spliterator
在此集合中的元素上创建一个Spliterator 。 实现应该记录拆分器报告的特征值。 如果拆分器报告Spliterator.SIZED并且此集合不包含元素,则不需要报告此类特征值。
默认实现应该被可以返回更有效的拆分器的子类覆盖。 为了保留stream()和parallelStream() } 方法的预期惰性行为,拆分器应该具有IMMUTABLE或CONCURRENT的特性,或者是后期绑定。 如果这些都不实用,则覆盖类应描述拆分器的绑定和结构干扰的文档化策略,并应覆盖stream()和parallelStream()方法以使用拆分器的Supplier创建流,如下所示:
Stream<E> s = StreamSupport.stream(() -> spliterator(), spliteratorCharacteristics)
这些要求确保由stream()和parallelStream()方法生成的stream()将反映在启动终端流操作时集合的内容。
返回:
此集合中元素的Spliterator
实现:
默认实现从集合的Iterator创建一个后期绑定拆分Iterator 。 拆分器继承了集合迭代器的快速失败属性。
创建的Spliterator报告Spliterator.SIZED 。
实现注意事项:
创建的Spliterator还会报告Spliterator.SUBSIZED 。
如果拆分器不包含任何元素,则报告除SIZED和SUBSIZED之外的其他特征值不会帮助客户端控制、专门化或简化计算。 但是,这确实允许共享使用不可变的空拆分器实例(请参阅Spliterators.emptySpliterator() )用于空集合,并使客户端能够确定此类拆分器是否不包含任何元素。
上述主要是stream方法的源码翻译,没有啥特别的.看看了解下,接下来将讲述stream常用方法以及一些简单举例,各位可以根据自己实际业务需求进行变更.(理解与方法均为博主个人理解,如果有误,不严谨的地方请见谅,也请各位指出.感谢)
举例时候主要用到的实体以及集合:
@Data
public class StreamTestBean {
/*** 编号 */ private Integer id; /** * 姓名 */ private String name; /** *年龄 */ private Integer age; /** * 性别 */ private String sex; /** * 存款 */ private Double deposit;
}
List<String> list = new ArrayList<>(); list.add("张三"); list.add("李四"); list.add("赵五"); list.add(null); list.add("张三弟弟");
博主将对象LIst和普通集合进行了封装 统称为 returnList();returnStreamTestBeans();两个方法
* filter
顾名思义,该方法为过滤,将一些不满足条件或者满足条件的集合过滤成一个新的集合.
> 普通集合过滤:
` //返回不为空的集合 List<String> stringIsNotNull = returnList().stream() .filter(Objects::nonNull) .collect(Collectors.toList()); //返回包含某字的集合 List<String> stringInclude = returnList().stream() .filter(Objects::nonNull) .filter(str->str.contains("张三")) .collect(Collectors.toList()); 返回结果: [张三, 李四, 赵五, 张三弟弟] [张三, 张三弟弟]`
> 对象集合过滤
//过滤出ID不为空的然后再过滤性别为女的 List<StreamTestBean> streamTestBeans = returnStreamTestBeans().stream() .filter(streamTestBean -> streamTestBean.getId()!=null) .filter(streamTestBean ->streamTestBean.getSex().equals("女")) .collect(Collectors.toList()); 返回结果: [StreamTestBean(id=4, name=丽萍, age=58, sex=女, deposit=100000.0), StreamTestBean(id=5, name=翠花, age=28, sex=女, deposit=30000.0)]
* map
相当于是对集合操作时候的一个中间操作,博主也确实没理解透彻,感觉就像是数据库里的视图一样.所以也不好举例,懂的朋友可以评论告知下.
//将对象转为ID集合 List<Integer> integerList = returnStreamTestBeans().stream() .map(StreamTestBean::getId) .collect(Collectors.toList()); 返回结果: [4, 5, 2, 1, 3, null] 如果不想要null就自己再过滤下
* mapToInt,mapToLong,mapToDouble
顾名思义,就是转为Integer,Long,Double流,可以对其内部数据进行聚合操作,加减,总和一类的
//输出集合内不为空的字符串长度
returnList().stream()
.filter(Objects::nonNull)
.mapToInt(String::length)
.forEach(System.out::println);
//转为double流对对象存款数据进行求和
double sum = returnStreamTestBeans().stream()
.filter(streamTestBean -> streamTestBean.getDeposit()!=null)
.mapToDouble(StreamTestBean::getDeposit).sum();
输出结果:
2,2,2,4
362000.0
> flatMap,flatMapToInt,flatMapToLong,flatMapToDouble
相对于上方不带flat的方法,个人理解为下发的可以对数据进行更深层的操作.说实话 博主没搞明白具体区别..求大神指点.
结尾 因为时间原因,本次更新到这里,过两天会继续更新其他方法,博主也需要继续学习下更深层的,多理解一些再来.
正文到此结束