并发流:

从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学习之流的短路与并发流的更多相关文章

  1. java8学习之Lambda表达式继续探讨&Function接口详解

    对于上次[http://www.cnblogs.com/webor2006/p/8186039.html]已经初步引入的Java8中Stream流的概念,其中使用了map的操作,它需要接受一个Func ...

  2. java8学习之Stream陷阱剖析

    上一次[http://www.cnblogs.com/webor2006/p/8297603.html]在最后用stream.iterate()生成了6个奇数,接着基于它来实现如下需求:找出该流中大于 ...

  3. JAVA8学习——深入浅出Lambda表达式(学习过程)

    JAVA8学习--深入浅出Lambda表达式(学习过程) lambda表达式: 我们为什么要用lambda表达式 在JAVA中,我们无法将函数作为参数传递给一个方法,也无法声明返回一个函数的方法. 在 ...

  4. JAVA8学习——新的时间日期API&Java8总结

    JAVA8-时间日期API java8之前用过的时间日期类. Date Calendar SimpleDateFormat 有很多致命的问题. 1.没有时区概念 2.计算麻烦,实现困难 3.类是可变的 ...

  5. 学习IO流

    学习IO流,不得不提到的就是JavaIO流.流就是字节序列的抽象概念,能被连续读取数据的数据源和能被连续写入数据的接受端就是流,流机制是Java及C++中的一个重要机制,通过流我们可以自由得控制文件, ...

  6. Java8学习笔记----Lambda表达式 (转)

    Java8学习笔记----Lambda表达式 天锦 2014-03-24 16:43:30 发表于:ATA之家       本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人 ...

  7. 谈一谈Java8的函数式编程(二) --Java8中的流

    流与集合    众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...

  8. Java8学习(3)- Lambda 表达式

    猪脚:以下内容参考<Java 8 in Action> 本次学习内容: Lambda 基本模式 环绕执行模式 函数式接口,类型推断 方法引用 Lambda 复合 上一篇Java8学习(2) ...

  9. Java8学习笔记目录

    Java8学习笔记(一)--Lambda表达式 Java8学习笔记(二)--三个预定义函数接口 Java8学习笔记(三)--方法引入 Java8学习笔记(四)--接口增强 Java8学习笔记(五)-- ...

随机推荐

  1. weak_ptr用法

    http://note.youdao.com/noteshare?id=39c10fda83320b2851e2073a5f69321c

  2. Xcode真机报错clang: error: linker command failed with exit code 1 (use -v to see invocation)

    出现这种错误,如下图所示,搜索bitcode,置为NO即可.

  3. java:nginx(java代码操作ftp服务器)

    1.检查是否安装了vsftpd [root@linux01 ~]# rpm -qa|grep vsftpd 2.安装vsftpd [root@linux01 ~]# yum -y install vs ...

  4. js 视差滚动 记录备份

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  5. Git-T

    或在命令行上创建一个新的存储库echo“#gittest”>> README.md git init git add README.md git commit -m“first commi ...

  6. idea关闭自动更新

    如何关闭idea的自动更新? File-Setting-Appearance&Beha-System Setting-Updates 取消勾选Automatically check updat ...

  7. Python 课件笔记

    Python 3.0 课件笔记 我们需要做的就是认真听取每一堂课,私下阅读老师博客笔记进行再复习,综合理解后写下自己的笔记,加深印象! Day1 - Python基础1 介绍.基本语法.流程控制

  8. Flume下载安装

    下载 可以apache官网下载flume的安装包 下载时注意,flume具有两个版本,0.9.x和1.x,两个版本并不兼容,我们用最新的1.x版本,也叫flume-ng版本. 安装 解压到指定目录即可 ...

  9. mac sudo异常

    dsenableroot -d -u <your_admin_username> -p <your_password>  

  10. windows vue环境搭建

    windows环境搭建Vue开发环境 一.安装node.js(https://nodejs.org/en/) 下载完毕后,可以安装node,建议不要安装在系统盘(如C:). 二.设置nodejs pr ...