Java Stream流的使用
流相关的方法可以分为三种类型,分别是:获取Stream流、中间方法、终结方法。中间方法会返回当前流,可以方便的进行链式调用。
流不可重复使用,否则会报错:
java.lang.IllegalStateException: stream has already been operated upon or closed
// 获取流的方式
List<Integer> list = Arrays.asList(1, 2, 4, 5, 5, 6, 7, 0);
String [] strArr = new String[]{"aaa", "bbb", "aaa"};
Stream<Integer> stream = list.stream(); // 从列表获取流
Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5); // 从可变参数获取流
Stream<String> arrStream = Stream.of(strArr); // 从数组获取流
常见的中间方法:
| 方法 | 用途 |
|---|---|
Stream<T> filter(Predicate<? super T> predicate) |
用于对流中的数据进行过滤。 |
Stream<T> limit(long maxSize) |
获取前几个元素 |
Stream<T> skip(long n) |
跳过前几个元素 |
Stream<T> distinct() |
去除流中重复的元素。依赖(hashCode和equals方法) |
static <T> Stream<T> concat(Stream a, Stream b) |
合并a和b两个流为一个流(也会遍历流,不可执行两次) |
Stream<T> sorted(Comparator<? super T> comparator) |
对元素进行合并 |
Stream map(Function<? super T, ? extends R> mapper) |
对每个元素进行处理 |
// filter()
stream.filter(x -> x > 0).filter(x -> x < 5).forEach(System.out::println);
// limit()
integerStream.limit(3).forEach(System.out::println);
// skip()
integerStream.skip(3).forEach(System.out::println);
// 去重
arrStream.distinct().forEach(System.out::println);
// 可将不同类型的Stream拼接到一起,不能执行两次
Stream<? extends Serializable> concat1 = Stream.concat(stream, arrStream);
// 将相同元素拼接到一起后,可以直接用一个类型接收
Stream<Integer> concat = Stream.concat(stream, integerStream);
// 排序
stream.sorted((x, y)->x - y).forEach(System.out::println);
// map()
List<Integer> collect = stream.map((Integer x) -> x * x).collect(Collectors.toList());
常见的收集函数:
| public static <T> Collector toList() | 把元素收集到List集合中 |
| <A> A[] toArray(IntFunction<A[]> generator) | 把元素收集到数组中 |
| public static <T> Collector toSet() | 把元素收集到Set集合中 |
| public static Collector toMap(Function keyMapper , Function valueMapper) | 把元素收集到Map集合中 |
// 收集成List
List<Digit> collect = list.stream().map(Digit::new).collect(Collectors.toList());
// 收集成数组,两个方法等效,务必要转换成对应的数组类型。
Integer[] integers = list.stream().toArray(length -> new Integer[length]);
Integer[] digits = list.stream().toArray(Integer[]::new); // 务必要用对应的类型
// 转换成Set
Set<Integer> collect1 = list.stream().collect(Collectors.toSet());
Digit [] data = new Digit[]{
new Digit("aaa", 10),
new Digit("bbb", 20)
};
// 转换成 Map
Map<String, Integer> collect3 = Stream.of(data).collect(Collectors.toMap(Digit::getDesc, Digit::getValue));
Java Stream流的使用的更多相关文章
- 一文带你入门Java Stream流,太强了
两个星期以前,就有读者强烈要求我写一篇 Java Stream 流的文章,我说市面上不是已经有很多了吗,结果你猜他怎么说:"就想看你写的啊!"你看你看,多么苍白的喜欢啊.那就&qu ...
- 全面吃透JAVA Stream流操作,让代码更加的优雅
全面吃透JAVA Stream流操作,让代码更加的优雅 在JAVA中,涉及到对数组.Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行 ...
- Java Stream 流如何进行合并操作
1. 前言 Java Stream Api 提供了很多有用的 Api 让我们很方便将集合或者多个同类型的元素转换为流进行操作.今天我们来看看如何合并 Stream 流. 2. Stream 流的合并 ...
- Java Stream 流(JDK 8 新特性)
什么是 Steam Java 8 中新增了 Stream(流)来简化集合类的使用,Stream 本质上是个接口,接口中定义了很多对 Stream 对象的操作. 我们知道,Java 中 List 和 S ...
- Java | Stream流、泛型、多线程 | 整理自用
1.lambda 表达式 lambda 的延迟执行 可以对程序进行优化,尤其是使用 if {} else {} 条件判断,先判断条件是否成立,再传入计算好的参数. functionName( para ...
- 深度掌握 Java Stream 流操作,让你的代码高出一个逼格!
概念 Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选.排序.聚合等. Stream 的操作符大体上分为两种:中间操作符和终止操作符 中 ...
- Java Stream流排序null以及获取指定条数数据
Java8的Stream流的一些用法, //排序 carerVehEntityList = carerVehEntityList.stream().sorted( Comparator.compari ...
- Java Stream简介, 流的基本概念
在Javaor .net编程中, 我们经常见到"stream" 这个字眼. 我们大概知道这是个流的意思, 如果看完本文的话, 应该会有1个大概的概念. 一, Java中什么是St ...
- Java Stream 自定义Collector
Collector的使用 使用Java Stream流操作数据时,经常会用到各种Collector收集器来进行数据收集. 这里便深入了解一点去了解Collector的工作原理和如何自定义Collect ...
随机推荐
- z—libirary最新地址获取,zlibirary地址获取方式,zliabary最新地址,zliabary官网登录方式,zliabary最新登陆
Z-Library(缩写为z-lib,以前称为BookFinder)是Library Genesis的镜像,一个影子图书馆项目,用于对学术期刊文章.学术文本和大众感兴趣的书籍(其中一些是盗版的)进行文 ...
- ubuntu 安装及配置Apache
一.下载.启动apache2 sudo apt-get install apache2 sudo /etc/init.d/apache2 restart 二.修改配置文件 1.更改网站根目录 sudo ...
- 全局索引与分区索引对于SQL性能影响的比较
KingbaseES 提供了对于分区表 global index 的支持.global index 不仅提供了对于唯一索引功能的改进(无需包含分区键),而且在性能上相比非global index (l ...
- 亚马逊云科技现身世界人工智能大会,揭示AI最新技术趋势
2022世界人工智能大会(WAIC)于日前落幕.经过过去四届的发展与沉淀,今天的世界人工智能大会已成为人工智能领域最有影响力的国际盛会之一,今年大咖云集.国际大厂扎堆,充分彰显了大会的国际影响力和磁力 ...
- 《Java基础——抽象与接口》
Java基础--抽象与接口 一.抽象: 规则: 关键字 abstract 修饰的类称为抽象类. 子类通过关键字extends实现继承. 关键字 abstract 修饰的方法称为抽象方法,抽 ...
- 2022-9-5 JavaSE note
Java SE 1.IDEA基本操作 psvm + 回车 : main() 方法声明 sout + 回车 : = System.out.println(); Ctrl + D : 把当前行复制到下一行 ...
- Python数据科学手册-前言
读Python数据科学手册 笔记 系列 数据科学 data science https://img2022.cnblogs.com/blog/2827305/202205/2827305-202205 ...
- Redisson多策略注解限流
限流:使用Redisson的RRateLimiter进行限流 多策略:map+函数式接口优化if判断 自定义注解 /** * aop限流注解 */ @Target({ElementType.METHO ...
- Grafana Loki 学习之踩坑记
转发自:https://mp.weixin.qq.com/s/zfXNEkdDC9Vqd9lh1ptC1g Grafana 出品的 loki 日志框架完美地与 kubernetes 的 label 理 ...
- Python离线安装Flask
受限于内网,无法使用pip install Flask直接安装. 以Flask-0.12.2为例 安装Flask需要以下的依赖性,在安装Flask离线版时可以看到依赖性要求. 离线安装文件地址: ht ...