1. 什么是Stream

Stream是一个数据处理接口,本身不存储任何数据。大概有20多个方法,每个都很好用,并且含有函数式编程里的filter,map,reduce方法。Stream的数据有三个来源:Collection, Array或者根据需要生成。

2. 创建Stream

在Java8中,添加了许多能够产生Stream的方法,如Pattern类中的splitAsStream方法,下面是三种典型常见的生成Stream的形式。

2.1 Collection创建Stream

Java8在Collection接口中添加了stream方法,可以从任何集合生成一个Stream。

List elements = Lists.newArrayList("element1", "element2", "element3");

Stream stream = elements.stream();

2.2 Array创建Stream

int[] nums = {1, 2, 3, 4};

Arrays.stream(nums);

// 使用数组的子集,包含start index,不包含end index。

Arrays.stream(nums, 0, 2);

2.3 直接生成Stream

有限Stream。给定元素,直接生成Stream。如果不是同一类型元素,就是Stream。

Stream stream = Stream.of(1, 2, 3);

无限Stream。使用Stream中的generate静态方法,需要传入一个Supplier接口实例。

// 常量Stream

Stream generate = Stream.generate(() -> "Echo");

// 随机数字的Stream

Stream generate2 = Stream.generate(Math::random);

无限Stream。使用Stream中的iterate静态方法,第一个参数是种子(起始元素),第二个参数是UnaryOperator接口实例。

// 0, 1, 2, 3, 4, ...

Stream iterate = Stream.iterate(0, n -> n + 1);

3. Filter、Map、Reduce方法

Stream的转换,是指从一个Stream中读取数据,经过处理后产生一个新的Stream。对Stream执行任何操作,都不会更改底层的数据集合(Collection或者Array),都是生成新的Stream,JDK中称为不干扰(noninterference)。

3.1 Stream::filter(Predicate p)

过滤一个Stream,新生成的Stream只含有符合条件的元素。

Stream words = Stream.of("int", "double", "String", "BigNumber");

Stream newWords = words.filter(w -> w.length() > 5);

3.2 Stream::map(Function f)

对Stream中的每个元素T,执行Function:: R apply(T)方法,生成的元素R组成一个新的Stream。Python的map是对多个list元素执行function,Stream的map只是对自己元素执行function。

Stream numbers = Stream.of(1, 2, 3, 4);

Stream map = numbers.map(n -> n++ + "");

3.3 Stream::reduce(BinaryOperator accumulator)

对Stream中的元素,两个两个循环处理,最后组合成一个元素。例如,对所有元素求和。

Stream nums = Stream.of(1, 2, 3, 4);

nums.reduce((x, y) -> x + y);

// 指定第一个元素

nums.reduce(0, (x, y) -> x + y);

4. 提取子Stream和合并Stream

获取Stream里前n个元素,组成新的Stream。如果n小于Stream的size,就返回原来的Stream。

Stream randoms = Stream.generate(Math::random).limit(10);

丢掉前n个元素,组成新的Stream。如果n大于Stream的size,就返回一个空的Stream。

Stream words = Stream.of("", "", "hello").skip(2);

将两个Stream合并成一个Stream

Stream stream1 = Stream.of(1, 2);

Stream stream2 = Stream.of(5, 6);

Stream concat = Stream.concat(stream1, stream2);

5. 并行Stream – 并行处理

默认情况下,都是创建一个串行Stream,方法Collection.paralleStream()除外。调用一个Stream中的parallel方法,就可将其转换成一个并行Stream。对并行Stream施加的任何方法,都是并行执行的,Java自己决定用多少线程来处理。

Stream nums = Stream.of(1, 2, 3, 4, 5, 6);

// 无序,打印每个元素

nums.parallel().forEach(n -> System.out.println(n));

// 强制有序处理

nums.parallel().forEachOrdered(System.out::println);

对于串行Stream,调用forEach()方法,始终是有序遍历。下面是并行求和的例子:

// 1, 2, 3 ... 100

Stream nums = Stream.iterate(1, n -> n + 1).limit(100);

Stream filtered = nums.parallel().filter(n -> n % 2 == 0);

注意:并行Stream使用上和串行Stream没有区别,但是并行Stream中应用的方法,必须是线程安全的。下面是个反面例子:

Stream words = Stream.of("Hello", "the", "world", "!");

int[] count = {0};

// 多个线程并行累加count[0]

words.parallel().forEach(s -> count[0] += s.length());

System.out.println(count[0]);

java8 stream index_Java8 Stream基本使用相关推荐

  1. 【Java8新特性】面试官问我:Java8中创建Stream流有哪几种方式?

    写在前面 先说点题外话:不少读者工作几年后,仍然在使用Java7之前版本的方法,对于Java8版本的新特性,甚至是Java7的新特性几乎没有接触过.真心想对这些读者说:你真的需要了解下Java8甚至以 ...

  2. java lambda collect_45分钟学会Java8 - Lambda和Stream

    Java11已出,Java8已是主流. 现在来一波操作,应该不会太迟(T_T) 注:本文持续更新 ^_^ 1. 前言 本文主要介绍Java8的2大主要新特性lambda表达式和Stream API,2 ...

  3. java8新特性stream深入解析

    2019独角兽企业重金招聘Python工程师标准>>> 继续java8源码的发烧热,越看越是有充实的感觉. 数据时代下的产物 Java顺应时代的发展推出的高效处理大量数据能力的api ...

  4. Java8中的Stream

    Java8 Stream是一个非常好用的工具,结合Lambda表达式,可以非常方便的来操作各种集合. 文章目录 Stream知识图谱 Stream概述 Stream的创建 Stream的使用 遍历/匹 ...

  5. Java基础学习总结(139)——Java8 Stream之Stream接口入门简介

    我们很多同学都知道,我们Java8中新增了很多有用的新功能,如Stream流.Lambda表达式等.今天在这里对Java8 的Stream的使用做个梳理和总结.Java语言中集合是使用最多的API,几 ...

  6. java8 lambda表达式Stream对List常用操作总结

    List最为java编程语音使用最频繁的数据结构之一,经常涉及到对List数据的各种处理,以前我们只能通过遍历的方式,自己去逐条处理,java8提供了Stream能够满足大部分日常对List的操作,如 ...

  7. 【Stream】java8新特性Stream流总结

    一.什么是stream 在 java8 中增加了一个新的抽象接口 Stream API,使用 Stream 操作集合类似于使用 SQL 语句数据库查找数据类似,提供直观的方法进行操作. Stream ...

  8. java8中的Stream用法详解

    项目github地址:bitcarmanlee easy-algorithm-interview-and-practice 欢迎大家star,留言,一起学习进步 1.为什么java8中加入Stream ...

  9. java8新特性-stream对map集合进行过滤的方法

    java8新特性-stream对map集合进行过滤的方法 stream对map集合进行过滤的方法

最新文章

  1. 用sublime server 启动本地服务器(手机访问电脑页面)
  2. idea 2018.2.2安装
  3. CMMI for Development读书笔记-目录
  4. 【STM32】STLINK调试程序教程
  5. 有没有通过代码退出程序的方法--官方解答
  6. sublime 设置自动换行
  7. 做到这4点,才是真正的持续交付| 研发效能提升36计
  8. goland 修改.gitignore无效问题
  9. python游戏开发框架_2018年Python主流框架有哪些?最流行的Python框架
  10. Apache 模块 mod_cache应用
  11. settings.xml‘ has syntax errors
  12. 计算机检索逻辑关系,第二讲 计算机检索基础知识.ppt
  13. Java个人博客项目
  14. ADC噪声全面分析 -02- ADC 噪声测量方法和相关参数
  15. 计算机朝微型化网络化发展例子,收集计算机朝微型化,网络化,智能化和多功能化发展的例子...
  16. html word 分页
  17. ajax小猿圈面试题,小猿圈之2019年前端JavaScript面试题(二)
  18. kodi树莓派_树莓派如何安装最新版Kodi 18.6 及树莓派4B针对Kodi的优化
  19. android url inputstream,Android HttpUrlConnection getInputStream引发NullPoint...
  20. html中的开启礼盒的代码,CSS3 蛋糕+生日礼盒打开动效

热门文章

  1. QTcpSever和QTcpSocket实现多线程客户端和服务端;
  2. 03-es6语法 Promise 和 es8语法 async await 的了解和基本使用
  3. 毕业设计周记(第二篇)
  4. 正则表达式**************************
  5. 学习HTML的第二次课
  6. 基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【三】VGG网络进行特征提取
  7. 自定义加载等待框(MBProgressHUD)
  8. ios学习8_KVC和字典转模型
  9. 《人月神话》阅读笔记一
  10. 套接字,TCP,UDP