java8新特性学习笔记(二) 流的相关思想
流是什么
流是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新特性学习笔记(二) 流的相关思想的更多相关文章
- java8新特性学习笔记(二) 使用流(各种API)
筛选和切片 用谓词筛选,筛选出各个不相同的元素,忽略流中的头几个元素,或将流截断至指定长度 用谓词筛选 Stream接口支持filter方法,该操作接受一个谓词(返回一个boolean的函数) 作为参 ...
- java8 新特性学习笔记
Java8新特性 学习笔记 1主要内容 Lambda 表达式 函数式接口 方法引用与构造器引用 Stream API 接口中的默认方法与静态方法 新时间日期 API 其他新特性 2 简洁 速度更快 修 ...
- Java8新特性学习笔记(一) Lambda表达式
没有用Lambda表达式的写法: Comparator<Transaction> byYear = new Comparator<Transaction>() { @Overr ...
- java8新特性学习笔记链接
https://blog.csdn.net/yitian_66/article/details/81010434
- Java8 新特性学习 Lambda表达式 和 Stream 用法案例
Java8 新特性学习 Lambda表达式 和 Stream 用法案例 学习参考文章: https://www.cnblogs.com/coprince/p/8692972.html 1.使用lamb ...
- 【Java8新特性】关于并行流与串行流,你必须掌握这些!!
写在前面 提到Java8,我们不得不说的就是Lambda表达式和Stream API.而在Java8中,对于并行流和串行流同样做了大量的优化.对于并行流和串行流的知识,也是在面试过程中,经常被问到的知 ...
- java8新特性学习:函数式接口
本文概要 什么是函数式接口? 如何定义函数式接口? 常用的函数式接口 函数式接口语法注意事项 总结 1. 什么是函数式接口? 函数式接口其实本质上还是一个接口,但是它是一种特殊的接口:SAM类型的接口 ...
- java8新特性学习1
java8增加了不少新特性,下面就一些常见的新特性进行学习... 1.接口中的方法 2.函数式接口 3.Lambda表达式 4.java8内置的四大核心函数式接口 5.方法引用和构造器引用 6.Str ...
- Java8 新特性学习
摘自:https://blog.csdn.net/shuaicihai/article/details/72615495 Lambda 表达式 Lambda 是一个匿名函数,我们可以把 Lambda ...
随机推荐
- Codeforces Round #316 (Div. 2) C 思路/模拟
C. Replacement time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- 讲的很详细的一篇关于object equals() & hashCode() 的文章
转: 讲的很详细的一篇关于object equals() & hashCode() 的文章 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java ...
- octave学习
前置安装 octave introduction 杂 clear; close all; clc刷新清空octave 如果写程序后缀名.m help commandname帮助 ;用法同c++ %注释 ...
- 【HDOJ5558】Alice's Classified Message(后缀数组)
题意:给定一个长度为n的下标从0开始的小写字母字符串,每次对于当前的i寻找一个j使得后缀i与后缀j的lcp最大,(j<i)若lcp相同则取较小的 若lcp为0则输出0与当前字符,i自增1,否则输 ...
- 更改MVC3默认错误提示信息 模型验证 validation
原文发布时间为:2011-07-20 -- 来源于本人的百度文章 [由搬家工具导入] Model Metadata and Validation Localization using Conventi ...
- 教你怎么使用Windows7系统自带的备份与还原的方法
原文发布时间为:2010-09-09 -- 来源于本人的百度文章 [由搬家工具导入] 继续单击“下一步”按钮,在其后界面中检查上述备份设置是否正确,如果不正确的话可以直接单击“取消”按钮,重新设置备份 ...
- php中Mail_mimeDecode无法读取foxmail等eml文件正文问题
使用$cat -A xx.eml文件,发现foxmail的eml文件文件结尾和空行使用的\r\r\n, 如: Received: from WDGTO0MYSBX754J (unknown [106. ...
- Ubuntu备份设置与恢复
打开家目录,按CTRL+H,显示所有隐藏文件,把所有文件名前面带点的文件(比如 .config).目录备份即可下次有问题就覆盖它
- Android代码中设置字体大小,字体颜色,显示两种颜色.倒计时效果
Android代码中设置字体大小,字体颜色,显示两种颜色 在xml文件中字体大小用的像素 <TextView android:id="@+id/uppaid_time" an ...
- Gym 101064 D Black Hills golden jewels 【二分套二分/给定一个序列,从序列中任意取两个数形成一个和,两个数不可相同,要求求出第k小的组合】
D. Black Hills golden jewels time limit per test 2 seconds memory limit per test 256 megabytes input ...