美文网首页码之初
Java8 Stream中间操作使用详解

Java8 Stream中间操作使用详解

作者: 庸人视角 | 来源:发表于2020-03-16 21:28 被阅读0次

    前面两篇简单的介绍了Stream以及如何创建Stream,没看的朋友可以戳这里:

    本篇就给大家说说stream有哪些用途,以及具体怎样使用。

    再次介绍Stream

    Stream 使用一种类似用于SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流,流在管道中传输,并且可以在管道的节点上进行处理,比如筛选,排序,聚合等。

    Stream两种操作

    • 中间操作(Intermediate Operations):中间操作会返回一个新的流,一个流可以后面跟随零个或多个intermediate操作。其目的主要是打开流,做出某种程度的数据映射/过滤,然后会返回一个新的流,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历。而是在终端操作开始的时候才真正开始执行。

    • 终端操作(Terminal Operations):是指返回最终的结果。一个流只能有一个terminal操作,当这个操作执行后,流就被使用“光”了,无法再被操作。所以这必定是流的最后一个操作。Terminal操作的执行,才会真正开始流的遍历,并且会生成一个结果,或者一个 side effect。

    中间操作方法分类:

    • filter()

    • map()

    • flatMap()

    • distinct()

    • sorted()

    • peek()

    • limit()

    • skip()

    终端操作方法分类:

    • forEach()

    • forEachOrdered()

    • toArray()

    • reduce()

    • collect()

    • min()

    • max()

    • count()

    • anyMatch()

    • allMatch()

    • noneMatch()

    • findFirst()

    • findAny()

    中间操作代码实例详解

    1、filter(): 返回结果生成新的流中只包含满足筛选条件的数据。

    // 1、filter,返回大于2的元素集合
    

    运行结果:[3, 4, 5]

    2、map():将流中的元素进行再次加工形成一个新流,流中的每一个元素映射为另外的元素。

    // 2、map:返回元素的大写类型和哈希值
    

    运行结果:mzcUpperCase:[MA, ZHI, CHU] ----- mzcHashCode:[3476, 120571, 98480]

    示例场景:取出商品的所有id,就可以这样写(伪代码):

    List<Product> productList = productService.selectAll();

    List<Integer> pIds = productList.stream().map(p->p.getId).collect(Collectors.toList());

    这样就可以拿到所有商品id的集合。

    3、flatMap():扁平化映射,它具体的操作是将多个stream连接成一个stream,这个操作是针对类似多维数组的,比如集合里面包含集合,相当于降维作用。

    flatMap是将流中的每个元素都放到一个流中,最后将所有的流合并成一个新流,所有流对象中的元素都合并到这个新生成的流中返回。

    // flatMap:将多层集合中的元素取出来,放到一个新的集合中去
    

    运行结果:[1, 2, 3, 4, 5, 6, 7, 8, 9]

    示例场景:取出所有部门人员的姓名,就可以这样写(伪代码):

    // 1、取出所有部门

    List<Department> departments = ...;

    // 2、这个时候可以利用flatMap先将所有部门的所有人员汇聚起来

    List<Person> persons = departments.stream.flatMap(d->d.getPersonList()).collect(Collectors.toList());

    // 3、再利用map()方法取出

    4、distinct():顾名思义,将流中的元素去重之后输出。

    // distinct:对元素去重
    

    运行结果:[ma, zhi, chu, shuo]

    5、sorted():这个很简单了,顾名思义,将流中的元素按照自然排序方式进行排序。

    // sorted:自然顺序排序
    

    运行结果:

    [1, 2, 3, 5, 6, 8]

    [8, 6, 5, 3, 2, 1]

    [1, 2, 3, 5, 6, 8]

    [1, 2, 3, 5, 6, 8]

    [8, 6, 5, 3, 2, 1]

    6、peek():对流中每个元素执行操作,并返回一个新的流,返回的流还是包含原来流中的元素。

    // peek():
    

    运行结果:

    a

    b

    c

    d

    zhi

    chu

    7、limit():顾名思义,返回指定数量的元素的流。返回的是Stream里前面的n个元素。

    // limit():取出100中的前十个
    

    运行结果:

    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    [ma, zhi, chu, wait]

    8、skip():和limit()相反,将前几个元素跳过(取出)再返回一个流,如果流中的元素小于或者等于n,就会返回一个空的流。

    // skip():跳过前面90个再返回
    

    运行结果:

    [91, 92, 93, 94, 95, 96, 97, 98, 99]

    [ma, zhi, chu, wait]

    []

    []

    上面讲了Stream流中间操作的使用详解,希望能给大家带来帮助,如果有用,还麻烦点个在看,或者分享给需要的小伙伴,独乐乐不如众乐乐,谢谢!
    因为考虑篇幅太长,大家看起来可能会有点累,所以Stream的终端操作使用详解,串行化、并行化区别,以及stream流总结放到后面的文章中。如果你还想了解更多其他方面的知识,欢迎留言鼓励,我会争取越写越好,越写越全面。

    相关文章

      网友评论

        本文标题:Java8 Stream中间操作使用详解

        本文链接:https://www.haomeiwen.com/subject/plooehtx.html