集合是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. 试图(View)

    试图是通过命名约定与动作方法想关联的.这个动作方法称为Index,控制器名称为Home; 添加试图,试图名与该试图相关联的动作方法的名称一致.

  2. Winform给TextBox设置默认值(获取焦点后默认值消失)

    主要是通过TextBox的获取焦点Enter和失去焦点Leave两个事件来实现的, 思路如下: 1.设置一个字符串常量,作为TextBox的默认值: 2.在界面的构造方法中将默认值赋值给TextBox ...

  3. CF23 E. Tree 树形dp+高精度

    题目链接 CF23 E. Tree 题解 CF竟让卡常QAQ dp+高精度 dp[x][j]表示以x为根的子树,x所属的联通块大小为j,的最大乘积(不带j这块 最后f[x]维护以x为根的子树的最大答案 ...

  4. BZOJ4556 HEOI2016字符串

    没错,又是这题,使用后缀自动机,反向建树,主席树维护right集合. By:大奕哥 #include<bits/stdc++.h> using namespace std; ; ]; ch ...

  5. hdu 4612 边双联通 ***

    题意:有N 个点,M条边,加一条边,求割边最少.(有重边) 链接:点我 先求双连通分量,缩点形成一个生成树,然后求这个的直径,割边-直径即是答案 #pragma comment(linker, &qu ...

  6. Codeforces Round #373 (Div. 2) C. Efim and Strange Grade 水题

    C. Efim and Strange Grade 题目连接: http://codeforces.com/contest/719/problem/C Description Efim just re ...

  7. mySql---剖析InnoDB索引原理

    摘要: 本篇为参考别人的文章(http://blog.csdn.net/voidccc/article/details/40077329) 1 各种树形结构 本来不打算从二叉搜索树开始,因为网上已经有 ...

  8. 青客宝团队Consul内部分享ppt

    青客宝团队Consul内部分享ppt   https://mp.weixin.qq.com/s?src=3&timestamp=1503647705&ver=1&signatu ...

  9. 国内代码托管git-osc基础使用教程

    git-osc是开源中国社区团队推出的基于Git的快速的.免费的.稳定的在线代码托管平台,不限制私有库和公有库数量.国内同类的有taocode.SVNchina等等 个人更喜欢git-osc的界面与操 ...

  10. One-wire Demo on the STM32F4 Discovery Board

    One-wire Demo on the STM32F4 Discovery Board Some of the devs at work were struggling to get their s ...