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

时间:2022-09-22 11:20:34

 流是什么

流是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新特性学习笔记&lpar;二&rpar; 使用流&lpar;各种API&rpar;

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

  2. java8 新特性学习笔记

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

  3. Java8新特性学习笔记&lpar;一&rpar; 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. 跨域问题,前端主动向后台发送cookie

    跨域是什么? 从一个域名的网页访问另一个域名的资源,就会出现跨域.只要协议.端口.域名有一个不同就会出现跨域 例如: 1.协议不同  http://www.baidu.com:80 和 https:/ ...

  2. Node&period;js在Windows与Linux下的安装

    一.Windows配置 (1)官网(http://nodejs.org)选择Node.js的Windows系统(32位和64位)最新版本. (2)下载完成后,执行MSI的安装文件. (3)安装完成,查 ...

  3. npm reset config

    To reset user defaults Run this in the command line (or git bash on windows): echo "" > ...

  4. Data Base Oracle下载及安装

    Oracle   下载及安装 一.官方下地址:   http://www.oracle.com/technetwork/database/enterprise-edition/downloads/in ...

  5. springMVC从上传的Excel文件中读取数据

    示例:导入客户文件(Excle文件) 一.编辑customer.xlsx 二.在spring的xml文件设置上传文件大小 <!-- 上传文件拦截,设置最大上传文件大小 10M=10*1024*1 ...

  6. Cocos2d-x3&period;0 捕Android菜单键和返回键

    原文地址:http://blog.csdn.net/qqmcy/article/details/26172665 .h void onKeyReleased(EventKeyboard::KeyCod ...

  7. python之路:变量与变量基本操作(老王版)

    python开发之路:变量与变量基本操作 你是一个师范大学的优秀毕业生,现在在某某小学工作. 你想:判作业真的很累,隔壁老王现在天天玩<蓝月传奇>,银行里存满了钱.唉,每节课1个小时,每个 ...

  8. cdnbest获取,删除,增加,修改域名列表,高级设置api示例

    <?php $uid = 28; $vhost = 'asdfw'; $token = getToken($uid, $vhost); print_r($token); //获取token fu ...

  9. HNOI2017 游记

    如果你要问我为什么现在才发出来,那是因为我太懒了 Day0: 日常看板子……不想写题,嘴巴了几道题之后也不想写…… 到了晚上颓起来了……回想了一下似乎也没有立什么flag,那就愉快地颓吧……深感技术下 ...

  10. 09&lowbar;组件三大属性&lpar;3&rpar;&lowbar;refs和事件处理

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...