java8新特性——Stream流
文章目录
- 一、Stream简介
- 二、Stream API
- 2.1 筛选和切片
- 2.1.1 filter
- 2.1.2 distinct
- 2.1.3 limit(n)
- 2.1.4 skip(n)
- 2.2 映射
- 2.2.1 map
- 2.2.2 flatMap
- 2.3 查找和匹配
- 2.3.1 anyMatch
- 2.3.2 allMatch
- 2.3.3 noneMatch
- 2.3.4 findAny
- 2.3.5 findFirst
- 2.4 归约
- 2.4.1 reduce
- 2.5 其他
- 2.5.1 of
- 2.5.2 empty
- 2.5.2 concat
- 2.5.3 peek
祸兮,福所依;福兮,祸所伏。
一、Stream简介
什么是流?
简单说,流是从集合中计算得来的一组元素序列。
集合与流之间的差异就在于什么时候进行计算:
集合是一个内存中的数据结构,它包含数据结构中目前所有的值——集合中的每个元素都得先算出来才能添加到集合中。
相比之下,流则是在概念上固定的数据结构(你不能添加或删除元素),其元素是按需计算的。
二、Stream API
2.1 筛选和切片
2.1.1 filter
筛选元素,例:筛选字符长度>3的元素
// 返回"three","four"
Stream.of("one", "two", "three", "four").filter((e) -> e.length() > 3);
2.1.2 distinct
元素去重
// 返回元素"one","three","four"
Stream.of("one", "one", "three", "four").distinct();
2.1.3 limit(n)
返回前n条数据
// 返回元素"one","two"
Stream.of("one", "two", "three", "four").limit(2);
2.1.4 skip(n)
跳过前 n 条数据
// 返回元素"three","four"
Stream.of("one", "two", "three", "four").skip(2);
2.2 映射
2.2.1 map
通常用于将一个类型转换成另外一个类型,也可以是同类型
// 将每个元素映射成大写
Stream.of("one", "two", "three", "four").map(String::toUpperCase);
// User -> UserDTO
User user = new User();
Stream<UserDTO> userDTOStream = Stream.of(user).map((u) -> {UserDTO dto = new UserDTO();BeanUtils.copyProperties(u, dto);return dto;});
补充:
mapToInt,将元素转换成int类型, 返回IntStream
mapToLong,将元素转换成long类型,返回LongStream
mapToDouble,将元素转换成double类型,返回DoubleStream
在操作原始数值类型时,最好使用原始类型特化流,因为这些流将元素特化为int、long、double等基本类型,从而避免了进行数值计算时,暗含的装箱、拆箱成本。
2.2.2 flatMap
流的扁平化。flatmap方法让你把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流。
它比较适用于Stream中元素是一个集合或数组的情况,比如:
Stream<String[]>
举个例子:words 数组元素为 {“one”,“two”,“three”},目标时将words以字符格式输出,即:‘o’ ‘n’ ‘e’ …
String[] words = {"one","two","three"};
Stream<String> stream = Stream.of(words);
// 分割字符串
Stream<String[]> stream1 = stream.map(e -> e.split(""));
// 将Stream<String[]> 转换成 Stream<String>
Stream<String> stringStream = stream1.flatMap(e -> Arrays.stream(e));stringStream.collect(Collectors.toList()).forEach(s -> System.out.print(s + " "));
说起来,flatMap有点像双层for循环,它可以对stream流中单个元素再进行拆分。
补充:
flatMapToInt,将元素扁平成int类型
flatMapToLong,将元素扁平成long类型
flatMapToDouble,将元素扁平成double类型
2.3 查找和匹配
2.3.1 anyMatch
流中是否有一个元素能匹配
2.3.2 allMatch
是否匹配所有元素
2.3.3 noneMatch
流中没有任何元素匹配
2.3.4 findAny
查找元素,返回当前流中的任意元素
2.3.5 findFirst
查找第一个元素
2.4 归约
2.4.1 reduce
reduce方法可以用在数字求和、乘积等场景。
它的作用是每次计算的时候都用到上一次的计算结果,比如求和操作:前两个数的和加上第三个数的和,一直加到最后一个数位置,最后返回结果。
int sum = IntStream.of(3, 4, 8).reduce(0, (a, b) -> a + b);
当然,这里用IntStream的sum方法更好
int sum = IntStream.of(3, 4, 8).sum();
2.5 其他
2.5.1 of
可接受一个泛型对象或可变泛型对象集合,返回一个Stream对象
Stream<String> stream = Stream.of("a", "b", "c");
2.5.2 empty
创建一个空的Stream对象
Stream<Object> empty = Stream.empty();
2.5.2 concat
连接两个Stream,返回一个新的Stream
Stream<String> a = Stream.of("a","b","c");Stream<String> b = Stream.of("d","e");Stream<String> c = Stream.concat(a,b);// 输出:abcdec.collect(Collectors.toList()).forEach(System.out::print);
2.5.3 peek
peek:窥视,窥探;
java源码中对这个方法进行了详细描述
简单说:这个方法的存在主要是为了支持调试
java源码提供的案例如下:
Stream.of("one", "two", "three", "four").filter(e -> e.length() > 3).peek(e -> System.out.println("Filtered value: " + e)).map(String::toUpperCase).peek(e -> System.out.println("Mapped value: " + e)).collect(Collectors.toList());
输出结果:
Filtered value: three
Mapped value: THREE
Filtered value: four
Mapped value: FOUR
这个方法的好处在于,我们可以在执行Stream的filter、map或者其他操作之后可以查看到数据执行的结果。
java8新特性——Stream流相关推荐
- Java8新特性Stream流详解
陈老老老板 说明:新的专栏,本专栏专门讲Java8新特性,把平时遇到的问题与Java8的写法进行总结,需要注意的地方都标红了,一起加油. 本文是介绍Java8新特性Stream流常用方法超详细教学 说 ...
- java8新特性stream流
参考自深蓝至尊的Java8 新特性之流式数据处理 一. 流式处理简介 在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式 ...
- Java8新特性——Stream流:不同于IO流的流,操作集合数据
文章目录 Stream流 1.认识Stream流(源码说明) 1.1.Stream流和Collection的区别 1.2.流的获取方式 1.3.流操作和管道 1.4.并行性 1.5.不干扰内政 1.6 ...
- 【Stream】java8新特性Stream流总结
一.什么是stream 在 java8 中增加了一个新的抽象接口 Stream API,使用 Stream 操作集合类似于使用 SQL 语句数据库查找数据类似,提供直观的方法进行操作. Stream ...
- java8新特性 Stream流的优雅操作
1. 使用传统的方式,遍历集合,对集合中的数据进行过滤 //创建一个List集合,存储姓名List<String> list = new ArrayList<>();list. ...
- Java8新特性stream流的优雅操作
文章目录 原因是因为我管理的小组提交代码被我review到了,发现只有个别同学使用到了stream流,所以出此blog,希望大家都写出优雅的代码 原因是因为我管理的小组提交代码被我review到了,发 ...
- 利用Java8新特性stream流给集合中的某个属性赋值
今天在编写一个返回对象VO时,需要做一些处理,返回对象VO如下: CollectListVO @Data @JsonIgnoreProperties(ignoreUnknown = true) @Ap ...
- Java8新特性 Stream流常用方法
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达 ...
- Java8新特性 stream流常用方法
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达 ...
- java8新特性-Stream流
直接贴代码: package com.c8a.stream;import lombok.AllArgsConstructor; import lombok.Data; import lombok.No ...
最新文章
- 3.2-3.3 Hive中常见的数据压缩
- 考研英语一2016年真题4篇阅读词汇句子积累(详细!!!)
- Redis 6.0 新特性:多线程连环 13 问!
- 【C++入门】简单的日期类操作
- Python的lambda函数
- php资源文件html,nginx 同一域名下分目录配置显示php,html,资源文件
- RouteOS 频繁自启
- highcharts:根据Y的数值范围,动态改变图形的填充颜色
- Instagram使用教程
- html5手机页面设计软件,5个非常优秀的免费H5页面制作工具(推荐)
- 网络安全工程师视频教程从入门到精通学习_网络安全入门教程
- 人民币大写金额转换为数字
- 金蝶k3wise 核算项目、辅助资料
- Oracle 轻量级实时监控工具 oratop
- iptable防火墙(一)
- docker 阿里云仓库地址
- java写的股票技术分析_基于Java语言开发的个性化股票分析技术:量能突破模型(Energe-Break)...
- 双网卡同时上内外网的方法
- Python基础之变量
- [笔记]c++Windows平台代码规范
热门文章
- C/C++[codeup 1785]字符串连接
- linux命令行中的大括号,linux命令行学习(19):花括号扩展(brace expansion)
- php文件显示代码行数,php统计文件中的代码行数
- leetcode 栈 二叉树的前向遍历
- 运算符重载的常识性问题
- 一个包含所有c++的头文件的头文件
- 大事化小、小事化了的动态规划
- 高数复习:极限与连续,一元函数微分学,一元函数积分学,多元函数微分学以及微分方程(思维导图版知识点总结)
- 最新基于高德地图的android进阶开发(3)GPS地图定位
- pdf 目录导入 macos