java.util.Stream 表示能应用在一组元素上一次执行的操作序列。Stream 操作分为中间操作或者最
终操作两种,最终操作返回一特定类型的计算结果,而中间操作返回Stream本身,这样你就可以将多
个操作依次串起来。Stream 的创建需要指定一个数据源,比如java.util.Collection 的子类,List
或者 Set, Map 不支持。Stream 的操作可以串行执行或者并行执行。

首先看看Stream是怎么用,首先创建实例代码的用到的数据List:

List<String> stringList= new ArrayList<>();
stringList.add("ddd2");
stringList.add("aaa2");
stringList.add("bbb1");
stringList.add("aaa1");
stringList.add("bbb3");
stringList.add("ccc");
stringList.add("bbb2");
stringList.add("ddd1");

Java 8扩展了集合类,可以通过 Collection.stream() 或者 Collection.parallelStream() 来创建一个
Stream。下面几节将详细解释常用的Stream操作:

Filter(过滤)

过滤通过一个predicate接口来过滤并只保留符合条件的元素,该操作属于中间操作,所以我们可以在
过滤后的结果来应用其他Stream操作(比如forEach)。forEach需要一个函数来对过滤后的元素依次
执行。forEach是一个最终操作,所以我们不能在forEach之后来执行其他Stream操作。

// 测试 Filter(过滤)
stringList.stream().filter((s) -> s.startsWith("a")).forEach(System.out::println);//aaa2 aaa1

forEach 是为 Lambda 而设计的,保持了最紧凑的风格。而且 Lambda 表达式本身是可以重用的,非
常方便。

Sorted(排序)

排序是一个中间操作,返回的是排序好后的 Stream。如果你不指定一个自定义的 Comparator 则会
使用默认排序。

// 测试 Sort (排序)
stringList.stream().sorted().filter((s) -> s.startsWith("a")).forEach(System.out::println);// aaa1 aaa2

需要注意的是,排序只创建了一个排列好后的Stream,而不会影响原有的数据源,排序之后原数据stringList是不会被修改的:

System.out.println(stringList);// ddd2, aaa2, bbb1, aaa1, bbb3, ccc, bbb2, ddd1

Map(映射)

中间操作 map 会将元素根据指定的 Function 接口来依次将元素转成另外的对象。

下面的示例展示了将字符串转换为大写字符串。你也可以通过map来讲对象转换成其他类型,map返回
的Stream类型是根据你map传递进去的函数的返回值决定的。

// 测试 Map 操作
stringList
.stream()
.map(String::toUpperCase)
.sorted((a, b) -> b.compareTo(a))
.forEach(System.out::println);
// "DDD2", "DDD1", "CCC", "BBB3", "BBB2", "AAA2", "AAA1"

Match(匹配)

Stream提供了多种匹配操作,允许检测指定的Predicate是否匹配整个Stream。所有的匹配操作都是 最终操作 ,并返回一个 boolean 类型的值。

// 只要有一个满足条件就返回true
boolean anyStartsWithA = stringList.stream().anyMatch((s) -> s.startsWith("a"));
System.out.println(anyStartsWithA); // true// 集合中的元素全部满足条件则返回true
boolean allStartsWithA = stringList.stream().allMatch((s) -> s.startsWith("a"));
System.out.println(allStartsWithA); // false// 集合中不包含有满足这个判断的元素或者流中元素为空的时候方法返回true
boolean noneStartsWithZ = stringList.stream().noneMatch((s) -> s.startsWith("z"));
System.out.println(noneStartsWithZ); // true

Count(计数)

计数是一个 最终操作,返回Stream中元素的个数,返回值类型是 long。

//测试 Count (计数)操作
long startsWithB = stringList.stream().filter((s) -> s.startsWith("b")).count();
System.out.println(startsWithB); // 3

Reduce(规约)

这是一个 最终操作 ,允许通过指定的函数来讲stream中的多个元素规约为一个元素,规约后的结果是通过Optional 接口表示的:

//测试 Reduce (规约)操作
Optional<String> reduced = stringList.stream().sorted().reduce((s1, s2) -> s1 + "#" + s2);
reduced.ifPresent(System.out::println);//aaa1#aaa2#bbb1#bbb2#bbb3#ccc#ddd1#ddd2

Parallel Streams(并行流)

前面提到过Stream有串行和并行两种,串行Stream上的操作是在一个线程中依次完成,而并行Stream
则是在多个线程上同时执行。

下面的例子展示了是如何通过并行Stream来提升性能:

首先我们创建一个没有重复元素的大表:

int max = 1000000;
List<String> values = new ArrayList<>(max);
for (int i = 0; i < max; i++) {UUID uuid = UUID.randomUUID();values.add(uuid.toString());
}

Parallel Sort(并行排序)

//并行排序
long t0 = System.nanoTime();
long count = values.parallelStream().sorted().count();
System.out.println(count);
long t1 = System.nanoTime();
long millis = TimeUnit.NANOSECONDS.toMillis(t1 - t0);
System.out.println(String.format("parallel sort took: %d ms", millis));
1000000
parallel sort took: 475 ms//串行排序所用的时间

上面两个代码几乎是一样的,但是并行版的快了 50% 左右,唯一需要做的改动就是将 stream() 改为
parallelStream()

Java 8 入门教程 - Streams(流)相关推荐

  1. java 接口入门,Java接口入门教程解读

    Java接口入门教程解读,学习Java技术开发是一个长期的过程,今天小编介绍Java接口相关知识内容 接口 是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量.构造方法和成员方法 ...

  2. 【Java mail 入门教程】第三讲 接收邮件

    ====================================================== 注:本文源代码点此下载 ================================= ...

  3. 小白零基础学习Java开发入门教程奉上,希望对你有所帮助!

    "持久和新"是编程语言方面对Java的适当评估. 想要进入互联网行业,想转向编程,Java无疑是一个非常普遍的选择. 但是,Java毕竟是一种编程语言,并且仍然存在一些技术障碍.如 ...

  4. java 输出中文_没见过的 Java 编程入门教程!例程使用中文标识符代码:问个好吧...

    前言 Java 教程用中文写(如下)更能被新手理解学习.可惜至今没有看到类似入门教程,在此敢为人先. 注意:本教程的所有 Java 代码都可以正确运行,因为 Java 早已支持中文命名标识符. 编程语 ...

  5. js读取http chunk流_极简 Node.js入门 教程双工流

    点击上方蓝字关注我们 小编提示: 本文是由 ICBU 的谦行小哥哥出品,我们会持续发出极简 Node.js入门 教程,敬请期待哦,文中有比较多的演示代码建议横屏阅读 双工流就是同时实现了 Readab ...

  6. JAVA入门Hwork,HBase Java编程入门教程

    一款优秀的数据库除了会提供客户端,还会提供编程语言接口,HBase 也不例外.HBase 除了支持使用 Shell 客户端来操作(请看<HBase Shell及其常用命令>),还提供了多种 ...

  7. Java swing入门教程(转载)

    swing入门教程(一) swing简介 UI 组件简介 在开始学习 Swing 之前,必须回答针对真正初学者的一个问题:什么是 UI?初学者的答案是"用户界面".但是因为本教程的 ...

  8. java adt入门教程_Android基础入门教程目录

    第一章:环境搭建与开发相关(已完结 10/10) https://blog.csdn.net/coder_pig/article/details/50000773 Android基础入门教程--1.1 ...

  9. java swing入门教程_JAVA swing初级教程(四)

    附加的swing小部件(下) JOptionPane JOptionPane 是在 Swing中类似"快捷方式"的东西.通常,作为UI开发人员,您需要向用户呈现快速信息,让用户了解 ...

最新文章

  1. 2008秋季-计算机软件基础-有序表合并 教材 P79, ex3
  2. Servlet笔记1
  3. 类型转换,类与类之间的转换,继承关系,继承与静态变量,子类父类重名,多继承,虚基类
  4. Hive的基本操作-创建外部表
  5. 受限玻尔兹曼机(Restricted Boltzmann Machine)分析
  6. sublime text3:提示 There are no packages available installation 解决方案
  7. 懂编译真的可以为所欲为|不同前端框架下的代码转换
  8. Python将浏览器cookies共享给requests库
  9. JAVA线程1 - 基本概念
  10. Git子模块头#39;引用不是树#39;错误
  11. linux桌面版如何添加新网络,ubuntu网络配置(桌面版和服务器版)
  12. spring之ControllerAdvice注解
  13. CS224N笔记——Word Window分类与神经网络
  14. 求最大公约数的MATLAB,matlab求最大公约数和最小公倍数
  15. 李沐动手学深度学习V2-NLP文本预处理和代码实现
  16. 百度编辑器ueditor-在线图片管理,想修改下默认的排序管理
  17. LoadRunner 11(LR11) 下载链接及破解方法
  18. 高科技引领时尚 甘肃天星独创全球共振迷你音响
  19. goip设备的特点_架设通讯网络设备为境外诈骗集团服务 3男子被田东警方抓获...
  20. 【速记】zipf distribution 实现算法

热门文章

  1. java web 找回密码_JavaWeb利用邮箱帮用户找回密码
  2. [转]如何在数据绑定时不让combox控件触发SelectedIndexChanged事件
  3. 申请onedrive api并使用rclone将其挂载为本地磁盘
  4. 基于Python实现的图像相似度检测
  5. 比较完整的NAT(网络地址转换)配置
  6. FSL 运行错误 error while loading shared libraries: libopenblas.so.0
  7. Android趣味课程:打地鼠游戏
  8. Dubbo Serialized class xxx.Xxx must implement java.io.Serializable问题解决
  9. sqlserver里面增加约束条件
  10. javascript 复习