java8学习之流的短路与并发流
并发流:
从api的角度来看,其实跟咱们之前一直在用的stream()方式差不多,但是底层是有明显的不同,所以这里初步先对并发流有一个基本的认识, 说到串行与并行,最直观的感受就是效率的不同,所以下面以一个相同条件下用串行流与并行流实现看具体耗时为例,来直观的感受一下它们两者在时间效率上的不同,如下:
生成500万个UUID,然后对其进行排序,最后看一下排序在串行与并行流中的耗时时间,具体做法如下:

这时执行时间是比较长的,接着则开始对写入的UUID进行排序,主要是对比排序的耗时时间,所以在开始排序前记录一下当前时间,然后在排序完之后再记录下当前时间,再算一下这两个时间总共的耗时长,先来看下串行流的方式:



接下来则利用串行流对其UUID集合元素进行排序,如下:

这里直接采用默认的排序,并打上时间字段看耗时如下:

对于上面标问号的部份算是一个新的写法,其中TimeUnit也是在1.5出来的辅助类:




那结合起来看:
d / (C2 / C0) = d / ((1000L * 1000L) / 1000L) = d / 1000L,那不就是将纳秒转换成了微秒了么?
下面来执行一下看用串行流排序会耗多少时间,由于比较耗时就不截动态图了,直接看执行结果:

这时再换成并行流,改一个方法既可:

运行看一下它的时间耗了多久:

如我们的预期并行流的方式明显比串行流的方式要快,根据原因是串行流是单线程去执行的,而并行流则是多线程去执行的,采用fork-join的方式去执行,这里有个感性的认识,关于串行流和并行流的底层的实现之后再去探讨它。
流的短路:
下面继续再看代码,对于一个字符串的集合,找出长度为5的单词,并且只找到第一个,并将其长度打出来,如下:

如何实现呢?下面开始:
既然最终是找的单词的长度,那可以将单词映射成长度,当然采用map操作喽,如下:

但是需要注意一下细节,既然知道映射之后的类型为int,那这里就最好用具化的map接口,mapToInt(),如下:

为什么要注意这个小细节,因为可以避勉装箱和拆箱,接着就是从集合中找出长度=5的元素,则需要对它进行过滤如下:

接着只找第一个,如下:

既然是Optional,那最佳写法应该是:

接着改一下元素的值,将其改成都没有长度为5的单词,看输出:

对于这个例子本身其实没啥意义,但是~~是为了说明下面的一个问题,下面对其进行进一步改造,如下:

那最终会输出啥呢?先来分析一下结果:

下面运行看一下是否如我们所想:

呃~~什么鬼~~那为啥只打印出了一个元素呢?下面解释一下:因为流的若干个中间操作是针对每一个元素的,意思也就是说当处理元素时会针对每一个元素应用这若干个操作,而且会将这些操作串行化,如mapToInt()执行完之后就会执行filter(),每个无素都会按这种串行的操作去执行,而非一个操作应用在各元素之后再应用其它操作,而且操作里面还存在一些短路的情况,结合咱们这个例子:

如果说将第一个元素改成长度不是5,再看打印:


stream.flatMap()应用:
接下来再来举例:对于如下集合:

找出所有的单词,并写将重复的单词给去重掉,那对于上面这个集合其结果应该为:hello、world、welcome。
那下面来实现下:
首先将单词以空格进行拆分,如下:

然后对单词去重:

接着编译运行:

分析一下原因:

那对数组进行去重那肯定就有问题啦,咱们可以将代码拆分一下验证下:

解决之道:再map()之后加上flatMap(),这个flatMap()我们在之前也已经接触过了,就是将元素打平成一个Stream,也就是Stream<String>,对单词进行去重得针对这种类型的Stream才行,所以代码修改为:

具体使用如下:

具体使用如下:

对于四个String[]的集合当然对应四个Stream啦,而flatMap操作实际就是将这四个Stream打平变成一个Stream,最后再去复打印如下:

java8学习之流的短路与并发流的更多相关文章
- java8学习之Lambda表达式继续探讨&Function接口详解
对于上次[http://www.cnblogs.com/webor2006/p/8186039.html]已经初步引入的Java8中Stream流的概念,其中使用了map的操作,它需要接受一个Func ...
- java8学习之Stream陷阱剖析
上一次[http://www.cnblogs.com/webor2006/p/8297603.html]在最后用stream.iterate()生成了6个奇数,接着基于它来实现如下需求:找出该流中大于 ...
- JAVA8学习——深入浅出Lambda表达式(学习过程)
JAVA8学习--深入浅出Lambda表达式(学习过程) lambda表达式: 我们为什么要用lambda表达式 在JAVA中,我们无法将函数作为参数传递给一个方法,也无法声明返回一个函数的方法. 在 ...
- JAVA8学习——新的时间日期API&Java8总结
JAVA8-时间日期API java8之前用过的时间日期类. Date Calendar SimpleDateFormat 有很多致命的问题. 1.没有时区概念 2.计算麻烦,实现困难 3.类是可变的 ...
- 学习IO流
学习IO流,不得不提到的就是JavaIO流.流就是字节序列的抽象概念,能被连续读取数据的数据源和能被连续写入数据的接受端就是流,流机制是Java及C++中的一个重要机制,通过流我们可以自由得控制文件, ...
- Java8学习笔记----Lambda表达式 (转)
Java8学习笔记----Lambda表达式 天锦 2014-03-24 16:43:30 发表于:ATA之家 本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人 ...
- 谈一谈Java8的函数式编程(二) --Java8中的流
流与集合 众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...
- Java8学习(3)- Lambda 表达式
猪脚:以下内容参考<Java 8 in Action> 本次学习内容: Lambda 基本模式 环绕执行模式 函数式接口,类型推断 方法引用 Lambda 复合 上一篇Java8学习(2) ...
- Java8学习笔记目录
Java8学习笔记(一)--Lambda表达式 Java8学习笔记(二)--三个预定义函数接口 Java8学习笔记(三)--方法引入 Java8学习笔记(四)--接口增强 Java8学习笔记(五)-- ...
随机推荐
- SQL优化手段
一.建立索引 要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引(order by desc会非常影响效率). 二.避免在建立索引的字段进行计算操作. 三.使用预编 ...
- Flume下载安装
下载 可以apache官网下载flume的安装包 下载时注意,flume具有两个版本,0.9.x和1.x,两个版本并不兼容,我们用最新的1.x版本,也叫flume-ng版本. 安装 解压到指定目录即可 ...
- linux静态IP配置和网关配置
我们在配置CentOS的时候,很多情况需要能联外网,那么就需要DNS解析功能,默认的是没有配置DNS信息的,所以我们得配置DNS信息起因我们在搜索Centos配置DNS信息的时候,很多都是说在这个文件 ...
- PTA(Basic Level)1057.数零壹
给定一串长度不超过 105 的字符串,本题要求你将其中所有英文字母的序号(字母 a-z 对应序号 1-26,不分大小写)相加,得到整数 N,然后再分析一下 N 的二进制表示中有多少 0.多少 1.例如 ...
- (public丶private丶protected) 的理解
public(公有):公有的类成员可以在任何地方被访问. protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问. private(私有):私有的类成员则只能被其定义所在的类访 ...
- kafka整理笔记笔记
一.为什么需要消息系统 解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多消息 ...
- 我的python学习之旅——安装python
windows下载安装: 1.下载安装包: 访问官方网站:https://www.python.org/downloads/ 下载自己想要的版本安装,这里下载当前最新版3.8: 选择64位的Windo ...
- 基于Keras的OpenAI-gym强化学习的车杆/FlappyBird游戏
强化学习 课程:Q-Learning强化学习(李宏毅).深度强化学习 强化学习是一种允许你创造能从环境中交互学习的AI Agent的机器学习算法,其通过试错来学习.如上图所示,大脑代表AI Agent ...
- C#中static修饰符的作用
static在C#中表示的是静态的,比如一个静态的字段是归类型所有,而非归对象所有,也就是说,在调用这个字段时,只能用类型去调,而不能用对象. 实例字段时随着对象创建而创建,对象销毁而销毁,而静态字段 ...
- 面向对象-this关键字的内存图解
/* 标准的代码改进版 this:哪个对象调用那个方法,this就代表那个对象 */ class Student { private String name; private int age; pub ...