Stream
1.Stream 流概述
Stream 流是Java 8(jdk 1.8)中新增的一个非常强大的API,它可以让我们以一种更加简洁、清晰和高效的方式来操作和处理集合和数组。Stream 流是一种基于集合的高级Sequence函数,它将一个集合或数组转换成一个Stream对象,可以对Stream对象进行各种操作,如筛选、排序、映射等,并且可以利用Stream的方式来进行并行处理,在处理数据的过程中,对于数据原始空间没有任何修改,不影响原始数据。
2.Stream 流的操作方式
2.1通过集合对象创建
ArrayList<String> list = new ArrayList<>();
list.stream()
2.2 通过数组创建
int[] arr = {1,2,3,4,5};
Arrays.stream(arr)
3. Stream 流相关方法
有了 Stream 对象就可以进行各种操作,Stream 流的操作可以分为中间操作和终止操作
3.1 Stream 流处理数据的中间方法
常用的中间操作包括skip、limit、sorted、filter、distinct等。
Strea<T> skip(long n);
限制跳过当前 Stream 流对应元素的个数,【掐头】
list.stream()
.skip(2)
.forEach(System.out::println);
Stream<T> limit(long n);
限制当前 Stream 流对应的元素总个数,【去尾】
list.stream()
.limit(5)
.forEach(System.out::println);
Stream<T> sorted();
对当前 Stream 流存储的数据进行排序操作,要求元素有自然顺序或者遵从 Comparable 接口,默认为【升序】
排序方法局限性很大,只能用于已经有自然顺序或者遵从 Comparable 接口的数据类型。
list.stream()
.sorted()
.forEach(System.out::println);
Stream<T> sorted(Comparator<? super T> com);
对当前 Stream 流的数据进行排序操作,排序规则由 Comparator 函数式接口规范
list.stream()
.sorted((p1,p2)-> p2.getAge() - p1.getAge())
.forEach(System.out::println);
Stream<T> filter(Predicate<? super T> pre);
判断过滤当前 Stream 流可以保存的数据条件,满足条件保留,不满足条件的数据移除,过滤规则由 Predicate 接口约束。
list.stream()
.filter(s->s.length > 2)
.forEach(System.out::println);
Stream<T> distinct();
当前 Stream 流中对应的所有元素进行去重操作
list.stream()
.distinct()
.forEach(System.out::println);
Stream<R> map(Function<R,T> fun);
当前 Stream 存储的数据转换为 Function 函数式接口要求的返回值类型,完成类型转换操作。
Stream<Person> stream = list.stream();
Stream<String> stringStream = stream.map(s -> s.toString());
stringStream.forEach(System.out::println);
3.2 Stream 流处理数据终止方法
常用的终止方法有 count、forEach、collect、toArray 等,当Stream 流执行终止方法后,Stream 流自动关闭,对应的 Stream 占用的资源空间会被 JVM 收回。
long count();
返回当前 Stream 流对应的数据元素的个数,为终止方法
Stream<String> stream = list.stream();
long count = stream
.skip(2)
.limit(5)
.count();
void forEach(Consumer<? super T> con);
针对于当前 Stream 存储元素的处置方法,为终止方法。
list.stream()
.skip(2)
.forEach(System.out::println);
<R, A> R collect(Collector<? super T, A, R collector);
Stream 流对应的元素存储内容,转换为用户要求的集合对象。为终止方法。
常用:
Collectors.toList() 目标存储集合类型为 List 集合
Collectors.toSet() 目标存储集合类型为 Set 集合
// Stream 流数据转换为 List 集合
list<String> list1 = list.stream()
.distinct()
.collect(Collectors.toList());
// Stream 流数据转换为 Set 集合
Set<String> set = list.stream()
.collect(Collectors.toSet());
Object[] toArray();
Stream 流存储的元素内容转换为 Object 类型数组返回
Object[] arr = num.stream().toArray();
4. Stream 流的优点
1. 高效性:Stream 流的并行处理可以让我们更好的利用 CPU 多核的特性,提高处理速度
2. 代码简洁:Stream 流的 API 提供了丰富的操作,使我们的代码更加简洁、易于阅读和维护
3. 可读性和可维护性:Stream 流的代码可以被拆分为多个子任务,容易实现并行化,从而使代码更加可读、可维护。