IT学习站-137zw.com

more +资源更新Forums

more +随机图赏Gallery

李梦娇2020年《公共基础知识》事业尊享套餐李梦娇2020年《公共基础知识》事业尊享套餐
马哥Linux高端运维云计算就业班 强烈推荐马哥Linux高端运维云计算就业班 强烈推荐
Flutter视频教程_Flutter仿京东商城项目实战视频教程Flutter视频教程_Flutter仿京东商城项目实战视频教程
实战Gradle3自动化项目构建技术精讲视频教程 百度云实战Gradle3自动化项目构建技术精讲视频教程 百度云
雅思7分旗舰VIP全程班 主讲:韩悦娇、赵楠等 完整版课程雅思7分旗舰VIP全程班 主讲:韩悦娇、赵楠等 完整版课程
剑指Java面试-Offer直通车 相当完美课程剑指Java面试-Offer直通车 相当完美课程

Java 8 Streams API 详解

Java 8 Streams API 详解

[复制链接]
123456835 | 显示全部楼层 发表于: 2019-11-14 12:50:01
123456835 发表于: 2019-11-14 12:50:01 | 显示全部楼层 |阅读模式
查看: 125|回复: 0
流式编程作为Java 8的亮点之一,是继Java 5之后对集合的再一次升级,可以说Java 8几大特性中,Streams API 是作为Java 函数式的主角来设计的,夸张的说,有了Streams API之后,万物皆可一行代码。
什么是Stream

Stream被翻译为流,它的工作过程像将一瓶水导入有很多过滤阀的管道一样,水每经过一个过滤阀,便被操作一次,比如过滤,转换等,最后管道的另外一头有一个容器负责接收剩下的水。
示意图如下:

首先通过source产生流,然后依次通过一些中间操作,比如过滤,转换,限制等,最后结束对流的操作。
Stream也可以理解为一个更加高级的迭代器,主要的作用便是遍历其中每一个元素。
为什么需要Stream

Stream作为Java 8的一大亮点,它专门针对集合的各种操作提供各种非常便利,简单,高效的API,Stream API主要是通过Lambda表达式完成,极大的提高了程序的效率和可读性,同时Stram API中自带的并行流使得并发处理集合的门槛再次降低,使用Stream API编程无需多写一行多线程的大门就可以非常方便的写出高性能的并发程序。使用Stream API能够使你的代码更加优雅。
流的另一特点是可无限性,使用Stream,你的数据源可以是无限大的。
在没有Stream之前,我们想提取出所有年龄大于18的学生,我们需要这样做:使用Stream,我们可以参照上面的流程示意图来做,首先产生Stream,然后filter过滤,最后归并到容器中。
转换为代码如下:

  • 首先stream()获得流
  • 然后filter(s->s.getAge()>18)过滤
  • 最后collect(Collectors.toList())归并到容器中
是不是很像在写sql?
如何使用Stream

我们可以发现,当我们使用一个流的时候,主要包括三个步骤:

  • 获取流
  • 对流进行操作
  • 结束对流的操作
获取流

获取流的方式有多种,对于常见的容器(Collection)可以直接.stream()获取
例如:

  • Collection.stream()
  • Collection.parallelStream()
  • Arrays.stream(T array) or Stream.of()
对于IO,我们也可以通过lines()方法获取流:

  • java.nio.file.Files.walk()
  • java.io.BufferedReader.lines()
最后,我们还可以从无限大的数据源中产生流:

  • Random.ints()
值得注意的是,JDK中针对基本数据类型的昂贵的装箱和拆箱操作,提供了基本数据类型的流:

  • IntStream
  • LongStream
  • DoubleStream
这三种基本数据类型和普通流差不多,不过他们流里面的数据都是指定的基本数据类型。对流进行操作

这是本章的重点,产生流比较容易,但是不同的业务系统的需求会涉及到很多不同的要求,明白我们能对流做什么,怎么做,才能更好的利用Stream API的特点。
流的操作类型分为两种:

  • Intermediate:中间操作,一个流可以后面跟随零个或多个intermediate操作。其目的主要是打开流,做出某种程度的数据映射/过滤,然后会返回一个新的流,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历。
    map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered

  • Terminal:终结操作,一个流只能有一个terminal操作,当这个操作执行后,流就被使用“光”了,无法再被操作。所以这必定是流的最后一个操作。Terminal操作的执行,才会真正开始流的遍历,并且会生成一个结果,或者一个 side effect。
    forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator

Intermediate和Terminal完全可以按照上图的流程图理解,Intermediate表示在管道中间的过滤器,水会流入过滤器,然后再流出去,而Terminal操作便是最后一个过滤器,它在管道的最后面,流入Terminal的水,最后便会流出管道。
下面依次详细的解读下每一个操作所能产生的效果:
中间操作

对于中间操作,所有的API的返回值基本都是Stream,因此以后看见一个陌生的API也能通过返回值判断它的所属类型。
map/flatMap
map顾名思义,就是映射,map操作能够将流中的每一个元素映射为另外的元素。
[code]  Stream map(Function

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
137zw.com IT学习站致力于免费提供精品的java技术教程和python技术教程,CCNA书籍/资料/CCNP书籍/资料教程/CCIE书籍/资料/H3C学习/认证/一级建造师考试/微软学习/认证/包括基础教程和高级实战教程,同时也提供分享网站源码下载和互联网相关一系列的技术教程,我们想做的就是让知识分享更有价值!(IT学习站官方唯一域名地址:www.137zw.com 请谨防假冒网站!)本站所有资源全部收集于互联网或网友自行分享,分享目的仅供大家学习与参考,如无意中侵犯您的合法权益,请联系本站管理员进行删除处理!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

浙ICP备19022368号-1|Archiver|手机版|IT学习站-137zw.com

GMT+8, 2020-9-20 23:04 , Processed in 0.184897 second(s), 45 queries .

快速回复 返回顶部 返回列表