java8 stream index_Java8 Stream基本使用
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基本使用相关推荐
- 【Java8新特性】面试官问我:Java8中创建Stream流有哪几种方式?
写在前面 先说点题外话:不少读者工作几年后,仍然在使用Java7之前版本的方法,对于Java8版本的新特性,甚至是Java7的新特性几乎没有接触过.真心想对这些读者说:你真的需要了解下Java8甚至以 ...
- java lambda collect_45分钟学会Java8 - Lambda和Stream
Java11已出,Java8已是主流. 现在来一波操作,应该不会太迟(T_T) 注:本文持续更新 ^_^ 1. 前言 本文主要介绍Java8的2大主要新特性lambda表达式和Stream API,2 ...
- java8新特性stream深入解析
2019独角兽企业重金招聘Python工程师标准>>> 继续java8源码的发烧热,越看越是有充实的感觉. 数据时代下的产物 Java顺应时代的发展推出的高效处理大量数据能力的api ...
- Java8中的Stream
Java8 Stream是一个非常好用的工具,结合Lambda表达式,可以非常方便的来操作各种集合. 文章目录 Stream知识图谱 Stream概述 Stream的创建 Stream的使用 遍历/匹 ...
- Java基础学习总结(139)——Java8 Stream之Stream接口入门简介
我们很多同学都知道,我们Java8中新增了很多有用的新功能,如Stream流.Lambda表达式等.今天在这里对Java8 的Stream的使用做个梳理和总结.Java语言中集合是使用最多的API,几 ...
- java8 lambda表达式Stream对List常用操作总结
List最为java编程语音使用最频繁的数据结构之一,经常涉及到对List数据的各种处理,以前我们只能通过遍历的方式,自己去逐条处理,java8提供了Stream能够满足大部分日常对List的操作,如 ...
- 【Stream】java8新特性Stream流总结
一.什么是stream 在 java8 中增加了一个新的抽象接口 Stream API,使用 Stream 操作集合类似于使用 SQL 语句数据库查找数据类似,提供直观的方法进行操作. Stream ...
- java8中的Stream用法详解
项目github地址:bitcarmanlee easy-algorithm-interview-and-practice 欢迎大家star,留言,一起学习进步 1.为什么java8中加入Stream ...
- java8新特性-stream对map集合进行过滤的方法
java8新特性-stream对map集合进行过滤的方法 stream对map集合进行过滤的方法
最新文章
- 用sublime server 启动本地服务器(手机访问电脑页面)
- idea 2018.2.2安装
- CMMI for Development读书笔记-目录
- 【STM32】STLINK调试程序教程
- 有没有通过代码退出程序的方法--官方解答
- sublime 设置自动换行
- 做到这4点,才是真正的持续交付| 研发效能提升36计
- goland 修改.gitignore无效问题
- python游戏开发框架_2018年Python主流框架有哪些?最流行的Python框架
- Apache 模块 mod_cache应用
- settings.xml‘ has syntax errors
- 计算机检索逻辑关系,第二讲 计算机检索基础知识.ppt
- Java个人博客项目
- ADC噪声全面分析 -02- ADC 噪声测量方法和相关参数
- 计算机朝微型化网络化发展例子,收集计算机朝微型化,网络化,智能化和多功能化发展的例子...
- html word 分页
- ajax小猿圈面试题,小猿圈之2019年前端JavaScript面试题(二)
- kodi树莓派_树莓派如何安装最新版Kodi 18.6 及树莓派4B针对Kodi的优化
- android url inputstream,Android HttpUrlConnection getInputStream引发NullPoint...
- html中的开启礼盒的代码,CSS3 蛋糕+生日礼盒打开动效
热门文章
- QTcpSever和QTcpSocket实现多线程客户端和服务端;
- 03-es6语法 Promise 和 es8语法 async await 的了解和基本使用
- 毕业设计周记(第二篇)
- 正则表达式**************************
- 学习HTML的第二次课
- 基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【三】VGG网络进行特征提取
- 自定义加载等待框(MBProgressHUD)
- ios学习8_KVC和字典转模型
- 《人月神话》阅读笔记一
- 套接字,TCP,UDP