原创

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的方法,个人理解为下发的可以对数据进行更深层的操作.说实话 博主没搞明白具体区别..求大神指点.

结尾 因为时间原因,本次更新到这里,过两天会继续更新其他方法,博主也需要继续学习下更深层的,多理解一些再来.

正文到此结束
阿里云主机低至1折