流是什么

流是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.

最新文章

  1. css keyframes动画属性设置
  2. iSight集成Adams/View:Adams组件
  3. asp.net页面跳转sessionid会变
  4. remove() 方法的兼容问题
  5. 读&lt;你必须知道的.NET&gt;IL指令笔记
  6. POj 1879 Tempus et mobilius Time and motion (模拟+群)
  7. WPF 完美截图 &lt;序&gt;
  8. 在vue生命周期中及时销毁全局作用的代码
  9. TCP TIME WAIT
  10. 【4】学习C++之内存管理
  11. ad9361自测试校准
  12. CentOS7.X中使用yum安装nginx的方法
  13. [HTML]音乐自动播放(兼容微信)
  14. tpshop linux安装下注意事项
  15. 「SDOI2014」重建 解题报告
  16. liunx tomcat 运行模式apr
  17. Confluence 6 通过 SSL 或 HTTPS 运行 - 创建或请求一个 SSL 证书
  18. SpringBoot2.x使用EasyPOI导入Excel浅谈
  19. centos6.9设置桥接网络模式方法
  20. netty源码解解析(4.0)-4 线程模型-概览

热门文章

  1. Spring Cloud Eureka简单入门
  2. 计算两个日期之间的天数差C++/java
  3. 【转】Unity3d实现物体围绕某一点进行旋转
  4. AlloyClip的简单使用
  5. Log4j官方文档翻译(五、日志输出的方法)
  6. Java实现简单的socket通信
  7. 【16】vuex2.0 之 getter
  8. JAVA神操作--使用Arthas线上热更新实战
  9. Eclipse SVN冲突详细解决方案
  10. redis批量删除脚本