流是什么

流是Java API的新成员,他允许你以声明的方式处理数据集合,就现在来说,可以把他们看成遍历数据集合的高级迭代器.此外,流还可以透明地并行处理,你无须写任何多线程代码.

下面例子是新老API的对比:

        List<Dish> menu = new ArrayList<>();
List<Dish> lowCaloricDishes = new ArrayList<>();
for (Dish d : menu) {
if (d.getCalories() < 400) {
lowCaloricDishes.add(d);
}
}
Collections.sort(lowCaloricDishes, new Comparator<Dish>() {
@Override
public int compare(Dish o1, Dish o2) {
return Integer.compare(o1.getCalories(), o2.getCalories());
}
}); List<String> lowCaloricDishName = new ArrayList<>();
for (Dish d : lowCaloricDishes) {
lowCaloricDishName.add(d.getName());
}

上面这段代码 用了一个"垃圾变量" lowCaloricDishes.他唯一的用途就是做一次中间容器,在Java8中 实现的细节被放在它本该归属的库里了.

       List<String> lowCaloricDishName = menu.stream()
.filter(d -> d.getCalories() < 400)
.sorted(Comparator.comparing(Dish::getCalories))
.map(Dish::getName)
.collect(Collectors.toList());
//为了利用多核架构并行执行这段代码,你只需要把stream()换成parallelStream():
List<String> lowCaloricDishName = menu.parallelStream()
.filter(d -> d.getCalories() < 400)
.sorted(Comparator.comparing(Dish::getCalories))
.map(Dish::getName)
.collect(Collectors.toList());

 流和集合

  集合和流的差异就在于什么时候进行计算,集合是一个内存中的数据接口,他包含数据接口中目前所有的值,集合中的每个元素都要先计算出来才能添加到集合中,相比之下流是概念上的固定数据结构,其元素则是按需计算的,这个思想就是用户仅仅从流中提取需要的值,而这些值在用户看不到的地方 按需生成.这是一种生产者消费者的关系,也可以说流是一个延迟创建的集合,只有在消费者要求的时候才会计算值,相反集合是急切创建的.

内部迭代和外部迭代

  使用Collection接口需要用户去做迭代,这称为外部迭代,相反,Streams库使用内部迭代, 他帮你把迭代做了 还把得到的流值存在了某个地方,你只要给出一个函数要干什么就可以了

下面代码说明了这种区别.

      List<String> names = new ArrayList<>();

        for (Dish d : menu) {//显示的顺序迭代菜单列表
names.add(d.getName());//提取名称并将其添加到累加器
} names = menu.stream()
.map(Dish::getName)//用getName方法参数化map 提取菜名
.collect(Collectors.toList());//开始执行操作流水线;没有迭代

其实说的白话一点,就是外部迭代就是显示的迭代, 而内部迭代就是告诉流,要怎么迭代流或者说如何计算值.

流操作

  java.util.stream.stream中的Stream接口定义了需要操作,他们可以分为两大类

          List<String> names = menu.parallelStream()//从菜单中提取流
.filter(d -> d.getCalories() < 400)//筛选 中间操作
.map(Dish::getName)//中间操作
.limit(3)//中间操作
.collect(Collectors.toList());//将Stream转化为List
  • filter,map,limit可以连成一条流水线
  • collect触发流水线执行并关闭它

可以连接起来的流操作为中间操作,关闭流的操作称为终端操作

中间操作

  中间操作会返回另一个流,这让多个操作可以连接起来形成一个查询,

终端操作

  终端操作会从流的流水线生产结果,比如list Integer甚至是void.

java8新特性学习笔记(二) 流的相关思想的更多相关文章

  1. java8新特性学习笔记(二) 使用流(各种API)

    筛选和切片 用谓词筛选,筛选出各个不相同的元素,忽略流中的头几个元素,或将流截断至指定长度 用谓词筛选 Stream接口支持filter方法,该操作接受一个谓词(返回一个boolean的函数) 作为参 ...

  2. java8 新特性学习笔记

    Java8新特性 学习笔记 1主要内容 Lambda 表达式 函数式接口 方法引用与构造器引用 Stream API 接口中的默认方法与静态方法 新时间日期 API 其他新特性 2 简洁 速度更快 修 ...

  3. Java8新特性学习笔记(一) Lambda表达式

    没有用Lambda表达式的写法: Comparator<Transaction> byYear = new Comparator<Transaction>() { @Overr ...

  4. java8新特性学习笔记链接

    https://blog.csdn.net/yitian_66/article/details/81010434

  5. Java8 新特性学习 Lambda表达式 和 Stream 用法案例

    Java8 新特性学习 Lambda表达式 和 Stream 用法案例 学习参考文章: https://www.cnblogs.com/coprince/p/8692972.html 1.使用lamb ...

  6. 【Java8新特性】关于并行流与串行流,你必须掌握这些!!

    写在前面 提到Java8,我们不得不说的就是Lambda表达式和Stream API.而在Java8中,对于并行流和串行流同样做了大量的优化.对于并行流和串行流的知识,也是在面试过程中,经常被问到的知 ...

  7. java8新特性学习:函数式接口

    本文概要 什么是函数式接口? 如何定义函数式接口? 常用的函数式接口 函数式接口语法注意事项 总结 1. 什么是函数式接口? 函数式接口其实本质上还是一个接口,但是它是一种特殊的接口:SAM类型的接口 ...

  8. java8新特性学习1

    java8增加了不少新特性,下面就一些常见的新特性进行学习... 1.接口中的方法 2.函数式接口 3.Lambda表达式 4.java8内置的四大核心函数式接口 5.方法引用和构造器引用 6.Str ...

  9. Java8 新特性学习

    摘自:https://blog.csdn.net/shuaicihai/article/details/72615495 Lambda 表达式 Lambda 是一个匿名函数,我们可以把 Lambda ...

随机推荐

  1. 通过TCP实现文件传输

    import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.In ...

  2. 关于设置组件的state时遇到的一些问题

    在使用react-bootstrap的时候设置showModel的值来控制Model的显示与隐藏,但是setState这个函数是异步的. 当你进行数据更新的时候,接着执行函数获取这个模态框的dom是获 ...

  3. O(1)gcd学习笔记

    设最大权值为\(M\) \(T=\sqrt M\) 定理 任意一个\(\le M\)的数一定可以表示为abc三个数的乘积 满足这三个数要么\(\le T\),要么是一个质数 证明: 考虑反证 假设\( ...

  4. 【linux命令】lscpu,/etc/cpuinfo详解

    lscpu  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 i2000:~ # lscpu Architecture:        ...

  5. Why Namespace?

    上一节我们讨论了 Neutron 将虚拟 router 放置到 namespace 中实现了不同 subnet 之间的路由.今天探讨为什么要用 namespace 封装 router? 回顾一下前面的 ...

  6. NOI2001食物链

    描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A吃B,B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人 ...

  7. [LeetCode] Linked List Cycle II 链表环起始位置

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...

  8. poj 2528 Mayor's posters 线段树 || 并查集 离线处理

    题目链接 题意 用不同颜色的线段覆盖数轴,问最终数轴上有多少种颜色? 注:只有最上面的线段能够被看到:即,如果有一条线段被其他的线段给完全覆盖住,则这个颜色是看不到的. 法一:线段树 按题意按顺序模拟 ...

  9. the project was not built since its build……

    [问题描述] 用eclipse编译程序时,出现下面错误: The project was not built since its build path is incomplete. Cannot fi ...

  10. Viewpager禁止滑动

    参考:http://www.jianshu.com/p/d3d766cf73d7 public class NoScrollViewPager extends ViewPager { private ...