集合是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. Unity3D导入MAX文件的一些问题(zz)

    1.轴向偏转 MAX模型导入Unity3D后,X轴会自动偏转-90度.是因为Unity3D采用的是左手坐标系,而3DMax采用的是右手坐标系.无奈啊,这是很多游戏引擎跟Max结合后都会产生的问题.兼容 ...

  2. linux 驱动之LCD驱动(有framebuffer)

    <简介> LCD驱动里有个很重要的概念叫帧缓冲(framebuffer),它是Linux系统为显示设备提供的一个接口,应用程序在图形模式允许对显示缓冲区进行读写操作.用户根本不用关心物理显 ...

  3. 【WIN10】WIN2D——繪製文字

    先看下截圖: 做了幾個效果:普通.倒影.陰影.歌詞. 普通效果代碼: private void normal_Draw(Microsoft.Graphics.Canvas.UI.Xaml.Canvas ...

  4. BZOJ 3253 Fence Repair 哈夫曼树 水题

    http://poj.org/problem?id=3253 这道题约等于合并果子,但是通过这道题能够看出来哈夫曼树是什么了. #include<cstdio> #include<c ...

  5. Codeforces.862D.Mahmoud and Ehab and the binary string(交互 二分)

    题目链接 \(Description\) 有一个长为\(n\)的二进制串,保证\(01\)都存在.你可以询问不超过\(15\)次,每次询问你给出一个长为\(n\)的二进制串,交互库会返回你的串和目标串 ...

  6. UVALive 6912 Prime Switch 状压DP

    Prime Switch 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8& ...

  7. 用Visio画泳道图

    在一次会议中看到有个同事在讲解业务流程时画了一个与PD中很类似的泳道图,但是在图的左侧确有一个阶段的列,事后与他沟通,才知道他这个图是”拼”出来的,也就是说所有的图都是他一点点的在画图工具中做出来的. ...

  8. 初识序列化和反序列化,使用BinaryFormatter类、ISerializable接口、XmlSerializer类进行序列化和反序列化

    序列化是将对象转换成字节流的过程,反序列化是把字节流转换成对象的过程.对象一旦被序列化,就可以把对象状态保存到硬盘的某个位置,甚至还可以通过网络发送给另外一台机器上运行的进程.本篇主要包括: ● 使用 ...

  9. Delphi加载驱动

    program Project2; uses Windows, Native, JwaWinType, Unit_Driver; function Is2KXp(): Boolean; var OSV ...

  10. Subversion detected an unsupported working copy version

    关于这个错误:Subversion detected an unsupported working copy version while checking the status of 'XXXX'. ...