集合是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. Wannafly挑战赛24游记

    Wannafly挑战赛24游记 A - 石子游戏 题目大意: A和B两人玩游戏,总共有\(n(n\le10^4)\)堆石子,轮流进行一些操作,不能进行下去的人则输掉这局游戏.操作包含以下两种: 把石子 ...

  2. 群晖NAS百度云Docker客户端下载目录没有权限的问题解决

    针对这篇文章:https://zhuanlan.zhihu.com/p/42267779的问题,需要ssh进去群晖,然后把目录设置成777权限.命令如下: sudo chmod -R 777 /vol ...

  3. 反编译APK文件的三种方法(转)

    因为学习Android编程的需要,有时我们需要对网络上发布的应用项目进行学习,可是Android项目一般是通过APK文件进行发布的,我们看不到源代码,嘿嘿,办法总会有的,而且不止一个... ps:对于 ...

  4. [Winform]Cefsharp重写alert与confirm弹窗

    摘要 在使用winform内嵌cefsharp浏览本地页面的时候,如果出现alert弹窗,会在标题栏显示页面所在目录.所以想起来重写alert的样式,通过winform的MessageBox进行提示. ...

  5. IIS7下配置ASP+ACCESS环境

    先要设置应用程序池(Application Pool)为Classic .NET AppPool,而不是默认的Default AppPool,可以在网站目录里对每个站点设置,也可以在站点进行单独设置. ...

  6. (ios7) 解决代码布局View, ios7 中 subView 高度增加StatusBar20dp的问题,保证Ios6,ios7代码一致

    在ios7 布局中,Status Bar 和 ToolBar ,NavigateBar 等都包含在ViewControl的主View中. 这样原来ios6 的View布局 整体向上移动了20dp,下面 ...

  7. MySQL递归查询树状表的子节点、父节点具体实现

    mysql版本(5.5.6等等)尚未支持循环递归查询,和sqlserver.oracle相比,mysql难于在树状表中层层遍历的子节点.本程序重点参考了下面的资料,写了两个sql存储过程,子节点查询算 ...

  8. Windows 下安装NPM

    第一步: 下载node.js的windows版 当前最新版本是https://nodejs.org/dist/   第二步:设置环境变量 把node.exe所在目录加入到PATH环境变量中. 配置成功 ...

  9. 关于spring session redis共享session的跨子域的处理

    安装完redis, spring端只要下面这两个bean配置上就可以用了 <?xml version="1.0" encoding="UTF-8"?> ...

  10. MySql、Oracle、MSSQL中的字符串的拼接

    字符串的拼接 1,Mysql 在Java.C#等编程语言中字符串的拼接可以通过加号“+”来实现,比如:"1"+"3"."a"+"b ...