前面有提到过lambda和函数式接口,但是JavaSE 8 除了这两个新特性之后还提供了很多有用的东西。例如Stream。

摸索了几天,终于弄明白Stream的应用了。

先推荐一篇文章:Java 8 中的 Streams API 详解

这里的Stream,是对集合进行操作的API。有点像流水线作业,可以一条线下来,也可以分成多条线并行。

Stream不是数据结构,而是算法和计算。所以Stream只需要被告知做什么,而不需要被告知怎么做。

举个例子,一个集合A里面有很多元素,现在想对这些元素进行操作。

传统方式:迭代器或者for循环遍历,然后对每个迭代或者遍历的元素进行操作,某种意义上说,这是有序的执行。

Stream:你只需要传入需要对元素进行的操作即可(lambda)。

【】需要告诉它做什么,不需要告诉它怎么做。例如需要统计,而不必有顺序。
    步骤:①创建一个Stream;②在一个或多个步骤中,指定将初始Stream转换成另一个Stream的中间操作;③使用一个终止操作来产生一个结果。之后Stream就不可用了。
    Collection接口中的新方法,可以将任何一个对象转成Stream。如果是一个数组,可以使用Stream.of()转成Stream。
    
    还有:Stream<Stream<Object>>这种。
    
    【】如果要对Stream中的每个对象都进行某个操作,使用【stream.map(lambda);】即可。
    【】但是,如果Stream中嵌套了Stream,那就需要使用【stream.flatMap(lambda);】。这时,lambda中需要调用Stream的方法进行操作。
        【】【】【】flatMap方法与map方法类似,区别在于mapping函数的返回值不同。map方法的mapping函数返回值可以是任何类型T,而flatMap方法的mapping函数必须是Stream。

  Stream的limit()方法,可以截取子Stream。可以用于Stream.generate(lambda).limit(100);
    
    Stream的聚合操作,如count()、max()、min()等,可以参照数据库的聚合函数理解。
    【】【】【】需要注意的是,这些聚合函数返回的是Optional对象,可以有效避免null情况--java8推荐的操作。    
    
    
        Stream.reduce(),常用的方法有average, sum, min, max, and count,返回单个的结果值,并且reduce操作每处理一个元素总是创建一个新值。
            //reduce()接收一个起始值(种子),然后将种子和后面的进行操作,并将结果再次作为种子。--后台方法肯定会选择一个种子(要么手动声明,要么让后台选择)
            //手动声明:stream.reduce(seed, lambda)  这里的lambda只需要声明一个参数,然后能同时操作seed和该参数并返回结果即可。
            //后台选择:stream.reduce(lambda)   这里的lambda需要显式的声明两个参数。后台会将stream的元素填入其中。

Stream.collect与stream.reduce方法不同,Stream.collect修改现存的值,而不是每处理一个元素,创建一个新值。
            //collect需要接收三个参数(保存到什么类型的对象中、用该类型的什么方法接收、多个该类型的对象怎么联合-并行用)
            //注意,①stream.collect返回的类型是保存到的类型。②Collectors中已经提供了同时具备三个参数的方法(多个方法)。
    
    自定义stream:Stream.generate()和Stream.iterate()。
        Stream.generate(Supplier)。
        Stream.iterate(seed, f) 跟 reduce 操作很像,接受一个种子值,和一个 UnaryOperator(例如 f)。然后种子值成为 Stream 的第一个元素,f(seed) 为第二个,f(f(seed)) 第三个,以此类推。
    
    【】【】如果是从Array等转成Stream,那这个Stream是有序的,但可以转成无序的。
    
    【】【】【】【】简单说,对 Stream 的使用就是实现一个 filter-map-reduce 过程,产生一个最终结果,或者导致一个副作用(side effect)。

写给大忙人的JavaSE 8 - 学习的更多相关文章

  1. 写给大忙人的spring cloud 1.x学习指南

    这几天抽空搞了下spring cloud 1.x(2.0目前应该来说还不成熟),因为之前项目中使用dubbo以及自研的rpc框架,所以总体下来还是比较顺利,加上spring boot,不算笔记整理,三 ...

  2. JavaSE入门学习21:Java面向对象之接口(interface)(二)

    一接口实现的多态 在上一篇博文:JavaSE入门学习20:Java面向对象之接口(interface)(一)中提到了接口的实现存在多态性,那么 这一篇主要就要分析接口实现的多态. 实例一 Test.j ...

  3. 《写给大忙人看的java se 8》笔记

    现在才来了解java8,是不是后知后觉了点? 新的编程技术,个人不喜欢第一时间跟进. 待社区已有实践积淀再切入似乎更划算些? 一点点精明的考虑. 不多说,上代码. //读<写给大忙人看的java ...

  4. javase建议学习路线

    javase建议学习路线:1.环境的搭建2.基本变量类型3.流程控制4.数组5.集合6.IO7.异常8.线程9.网络编程

  5. 【读书笔记】《写给大忙人看的Java SE 8》——Java8新特性总结

    虽然看过一些Java 8新特性的资料,但是平时很少用到,时间长了就忘了,正好借着Java 9的发布,来总结下一些Java 8中的新特性. 接口中的默认方法和静态方法 先考虑一个问题,如何向Java中的 ...

  6. JavaSE入门学习7:Java基础语法之语句(下)

    继续接着Java基础语法来:JavaSE入门学习5:Java基础语法(一)和JavaSE入门学习6:Java基础语法(二). 语句 Java经常使用的3种循环:while.do...while,for ...

  7. JavaSE的学习路线

    基于现阶段的JavaEE学习的对象,主要是趋向于Web的方向,主要就是说在JavaWeb的基础上进行进一步的开发和学习,下面我会将自己总结的对于自己的一点关于JavaEE学习路线会逐步讲解. 第一部分 ...

  8. JavaSE入门学习6:Java基础语法之运算符和语句(上)

    继续接着上篇:JavaSE入门学习5:Java基础语法(一)来看Java的基础语法. 五运算符 运算符是一种"功能"符号,用以通知Java进行相关的运算.比方.我们须要将变量age ...

  9. 《写给大忙人看的Java核心技术》 勘误

    先附上十分讨喜的封面.这应该是爱丽丝梦游仙境里的那只兔子吧? 勘误表基于原版勘误表制作 链接 截止日期 2017-02-09 对应<写给大忙人看的Java核心技术>2016年1月第1次印刷 ...

随机推荐

  1. LCA近期公共祖先

    LCA近期公共祖先 该分析转之:http://kmplayer.iteye.com/blog/604518 1,并查集+dfs 对整个树进行深度优先遍历.并在遍历的过程中不断地把一些眼下可能查询到的而 ...

  2. SQL批量删除用户表(先删除所有外键约束,再删除所有表)

    --批量删除用户表 --1.删除外键约束DECLARE c1 cursor for     select 'alter table ['+ object_name(parent_obj) + '] d ...

  3. java中如何设置下载文件

    如果想要设置某一url为下载文件的方法如下 需要设置文件响应类型,使用response.setContentType,比如jpeg格式的图片.如果想要访问该页面时出现下载保存的窗口,使用respons ...

  4. 启动vim不加载.vimrc

    启动vim,不加载.vimrcvim -u NONE -N

  5. MYSQL IO innodb-buffer-pool

    http://mysql.taobao.org/monthly/2016/02/02/ MySQL · 性能优化· 5.7.6 InnoDB page flush 优化 MySQL · 性能优化· I ...

  6. Generics Variance

    http://research.microsoft.com/pubs/64031/designandimplementationofgenerics.pdf Variance and Generali ...

  7. C#解压或压缩文件夹

    这里主要解决文件夹包含文件夹的解压缩问题.1)下载SharpZipLib.dll,在http://www.icsharpcode.net/OpenSource /SharpZipLib/Downloa ...

  8. Jquery获取下拉选择节点名称值赋给textbox文本框 获取 父节点的栏目名称编号

    <label for="parentNode" style="float:left" >父级栏目:</label> <select ...

  9. nrm 的使用

    我们介绍过cnpmjs.org和淘宝 npm 两个 NPM 镜像.除此之外,还有一些国外的 NPM 镜像.不同地区访问不同的镜像速度可能有差异,因此有时候需要切换 NPM 镜像.相比每次切换时都手动指 ...

  10. iOS开发之Xcode常见错误

    一."file/file.h" file not found 如果遇到这种类型的问题报错,可以分为三部来解决,由简到复杂一步一步来,直到解决问题位置.1. 点击Xcode -> ...