集合是Java中使用最多的API,但集合操作却远远算不上完美。主要表现在两点,
   第一,集合不能让我们像数据库的SQL语言一样用申明式的语言指定操作;
   第二,现在的集合API无法让我们比较方便地执行并行操作。
 
第一节,流是什么?
   流是Java API的新成员,它允许你声明性的方式处理数据集合,也就是通过查询语句来表达,而不是临时编写一个实现。此外,流还可以透明的并行处理,你无需写任何多线程代码了。在这里,作者给了一个例子,分别用Java7和Java8来实现一个返回低热量的菜肴名称的例子,这里用到了流的parallelStream、filter、sorted、map、collect,共5个API。用Java8的实现,确实比较完美。简单易读。
   总结来说就是,Java8中的流API可以让你写出这样的代码,
   第一,申明性,更简洁,更易读。
   第二,可复合,更灵活。
   第三,可并行,性能更好。
 
第二节,流简介
   我们可以从一个集合或者从数值的范围或者从I/O资源来生成流元素。
   那么流到底是什么呢?简短的定义就是:从支持数据处理操作的源生成的元素序列。
   集合是数据结构,所以它的主要目的是以特定的时间和空间复杂度存储和访问元素,但流的目的在于表达计算。
   集合讲的是数据,流讲的是计算。
   很多流操作本身也会返回一个流,这样多个操作就可以连接起来,形成一个大的流水线。就让我们下一章中的一些优化成为可能,比如延时和短路。    
 
    menu.stream().filter( d->d.getCalories() > 300).map(Dish::getName).limit(3).collect(toList());
   在上面的流操作的例子中,我们最后给了一个collect操作,那么在调用collect之前其实没有任何结果产生。实际上根本就没有从菜单里面选择元素,你可以这么理解,链中的方法调用都在排队等待,直到调用了collect。
 
第三节,流与集合
   集合与流之间的差异就在于什么时候进行计算。
   集合中的每个元素都得先算出来才能添加到集合中。相比之下,流则是在概念上固定的数据结构,其元素则是按需计算的。换句话说,流就像是一个延迟创建的集合,只有在消费者要求的时候才会计算。
   和迭代器类似,流只能被遍历一次。这里作者给出了一个对一个流遍历两次的例子,
     List<String> title = Arrays.toList("Java8", "In", "Action");
Stream<String> s = title.stream();
s.forEach(System.out::println);
s.forEach(System.out::println);
   
   此时程序就会抛出异常。
   你可以把流看作在时间中分布的一组值,而集合则是在空间(内存)中分布的一组值。
   接下来作者提到了内部迭代与外部迭代的概念,他就说明了流所引入的这种内部迭代所带来的好处。流对迭代做了封装,这样Stream库的内部结算就可以自动选择一种适合你的硬件的数据表示和并行的实现方式。
 
第四节,流操作
   可以连接起来的流操作称为中间操作,比如filter,map,sorted,limit等。关闭流量操作,则称为终端操作,比如collect,count。
   中间操作会返回一个流,这样多个操作可以连接起来形成一个查询,重要的是,除非流水线上触发了一个终端操作,否则中间操作不会执行任何处理,因为他们都很懒。
   中间操作一般都可以合并起来,在终端操作时一次性全部处理。我们把这种技术叫做循环合并,作者在这里给了一个例子可以比较清楚地看出确实是有循环合并。
     List<String> names = menu.stream().filter( d-> {
System.out.println("filtering" + d.getName());
return d.getCalories() > 300;
})
.map( d->{
System.out.println("mapping" + d.getName());
return d.getName();
})
.limit(3)
.collect(toList());
    System.out.println(names());     
   终端操作从流的流水线生成结果,其结果是任何不是流的值,比如List、Integer、甚至是void都是可以的。
   
   总而言之,流的使用一般包括三件事:
    一、数据源,来执行一个查询,
    二、中间操作链,来形成一条流的流水线,
    三、终端操作,来执行流水线,并生成结果。
    
 

读书笔记,《Java 8实战》,第四章,引入流的更多相关文章

  1. [读书笔记] R语言实战 (四) 基本数据管理

    1. 创建新的变量 mydata<-data.frame(x1=c(2,2,6,4),x2=c(3,4,2,8)) #方法一 mydata$sumx<-mydata$x1+mydata$x ...

  2. 读书笔记 - js高级程序设计 - 第四章 变量 作用域 和 内存问题

      5种基本数据类型 可以直接对值操作 判断引用类型 var result = instanceof Array 执行环境 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这 ...

  3. Spring实战第四章学习笔记————面向切面的Spring

    Spring实战第四章学习笔记----面向切面的Spring 什么是面向切面的编程 我们把影响应用多处的功能描述为横切关注点.比如安全就是一个横切关注点,应用中许多方法都会涉及安全规则.而切面可以帮我 ...

  4. 【读书笔记《Bootstrap 实战》】6.单页营销网站

    我们已经掌握了很多实用 Bootstrap  的重要技能.现在,是时候拿出更多的创意来帮助客户实现他们全方位在线营销的愿望了.此次将带领大家做一个漂亮的单页高端营销网站. 主要任务如下: □ 一个大型 ...

  5. 《深入了解java虚拟机》高效并发读书笔记——Java内存模型,线程,线程安全 与锁优化

    <深入了解java虚拟机>高效并发读书笔记--Java内存模型,线程,线程安全 与锁优化 本文主要参考<深入了解java虚拟机>高效并发章节 关于锁升级,偏向锁,轻量级锁参考& ...

  6. 《C#从现象到本质》读书笔记(九)第11章C#的数据结构

    <C#从现象到本质>读书笔记(九)第11章C#的数据结构 C#中的数据结构可以分为两类:非泛型数据结构和泛型数据结构. 通常迭代器接口需要实现的方法有:1)hasNext,是否还有下一个元 ...

  7. 《Java程序设计》第四章-认识对象

    20145221<Java程序设计>第四章-认识对象 总结 教材学习内容总结 类与对象 定义:对象是Java语言中重要的组成部分,之前学过的C语言是面向过程的,而Java主要是面向对象的. ...

  8. Rxjava2实战--第四章 Rxjava的线程操作

    Rxjava2实战--第四章 Rxjava的线程操作 1 调度器(Scheduler)种类 1.1 RxJava线程介绍 默认情况下, 1.2 Scheduler Sheduler 作用 single ...

  9. 《C#从现象到本质》读书笔记(八)第10章反射

    <C#从现象到本质>读书笔记(八)第10章反射 个人感觉,反射其实就是为了能够在程序运行期间动态的加载一个外部的DLL集合,然后通过某种办法找到这个DLL集合中的某个空间下的某个类的某个成 ...

  10. 《C#从现象到本质》读书笔记(七)第9章 泛型

    <C#从现象到本质>读书笔记(七)第9章 泛型 泛型的三大好处:类型安全,增强性能(避免装箱和拆箱),代码复用. 泛型方法是传入的参数至少有一个类型为T(尚未制定的类型,根据微软的命名规则 ...

随机推荐

  1. react运行阶段

    运行中可以使用的函数componentWillReceiveProps:父组件修改属性触发,可以修改新属性,修改状态.字面意思,组件将要接收属性,这个函数触发的时机就是组件的属性将要发生改变的时候,但 ...

  2. HDU3439 Sequence

    今天下午学习了二项式反演,做了一道错排的题,开始了苦逼的经历. 显然答案是C(︀n,k)︀*H(n − k).其中H(i)为长度为i的错排序列 然后经过课件上一番二项式反演的推导 我就写了个扩展卢卡斯 ...

  3. Codeforces.643E.Bear and Destroying Subtrees(DP 期望)

    题目链接 \(Description\) 有一棵树.Limak可以攻击树上的某棵子树,然后这棵子树上的每条边有\(\frac{1}{2}\)的概率消失.定义 若攻击以\(x\)为根的子树,高度\(ht ...

  4. C++ 队列(queue)堆栈(stack)实现基础

    Queue 在C++中只要#include<queue>即可使用队列类,其中在面试或笔试中常用的成员函数如下(按照最常用到不常用的顺序) 1. push 2. pop 3. size 4. ...

  5. hdu 5735 Born Slippy 暴力

    Born Slippy 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5735 Description Professor Zhang has a r ...

  6. GitLab目录迁移方法

    在生产环境上迁移GitLab的目录需要注意一下几点: 1.目录的权限必须为755或者775 2.目录的用户和用户组必须为git:git 3.如果在深一级的目录下,那么git用户必须添加到上一级目录的账 ...

  7. CAS与LDAP集成

    参考文献: CAS集成ldap:https://wiki.jasig.org/display/CASUM/LDAP CAS集成restful api:https://wiki.jasig.org/di ...

  8. Uniscribe相关文章

    相关资料很少 http://msdn.microsoft.com/en-us/library/windows/desktop/dd374127(v=vs.85).aspx http://www.cnb ...

  9. Word中如何从某一页重新开始页码

  10. 解决Mac OS下安装MyEclipse报错:Your system does not have sufficient memory to support MyEclipse

    最近想尝尝鲜,FQ去www.myeclipseide.com上下载了最新版的MyEclipse 15CI版,安装的时候,报告如下错误(MyEclipse 14也会出现这个问题): Your syste ...