Java8 Stream

本文详细介绍了Java8 Stream的作用、概念以及主要方法,包括如何创建Stream、中间操作与结束操作的区别,以及map、filter、reduce等核心方法的使用案例。通过对Stream的深入理解,可以更好地利用Java8进行集合的高效处理。
摘要由CSDN通过智能技术生成
1 Java8 Stream作用

#为集合提供聚合操作的能力
这个SQL的操作就是聚合操作,在查出结果后进行最大值的计算:

SELECT max(salary), employee_id, employee_name FROM Employee;

Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作或大批量数据操作,如:遍历、排序、过滤等;

2 Java8 Stream详解

2.1 Stream是什么
#Stream(流)是一个来自数据源的元素队列并支持聚合操作;
#与java.io包里的InputStream和OutputStream是完全不同的概念;
#不同于XML 解析的 Stream,也不是大数据实时处理的 Stream;

Stream 不是集合元素,它不是数据结构并不保存数据,它和算法、计算有关,它更像一个高级版本的 Iterator,像迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历完即用尽了,就好比流水从面前流过,一去不复返,和迭代器又不同的是,Stream 可以并行化操作,迭代器只能命令式地、串行化操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程;

1 串行遍历时,每个 item 读完后再读下一个 item;
2 并行遍历时,数据会被分成多个段,其中每一个都在不同的线程中处理,然后将结果一起输出;

2.2 java.util.stream包
这里写图片描述
由关系图可以看到Stream接口只有一个实现类:ReferencePipeline
重要的***filter、map***等方法就是在该类里实现的;

2.3 Stream执行步骤
当我们使用一个流的时候,通常包括三个基本步骤:
***获取一个数据源(source)***→ 数据转换***→***执行各种操作并获取结果
每次转换原有 Stream 对象不改变(可以有多次转换),返回一个新的 Stream 对象;
这就允许对其操作可以像链条一样排列,变成一个管道,如下图所示:
这里写图片描述

2.4 Stream操作类别
***Intermediate(中间操作)***:一个流可以后面跟随零个或多个 intermediate 操作。其目的主要是打开流,做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历。
***Terminal(结束操作)***:一个流只能有一个 terminal 操作,当这个操作执行后,流就被使用“光”了,无法再被操作。所以这必定是流的最后一个操作。Terminal 操作的执行,才会真正开始流的遍历(内部迭代),并且会生成一个结果,或者一个 side effect。

Intermediate(中间操作)通过管道模式(Pipeline)实现
Terminal(结束操作)通过访问者模式(Visitor)实现

2.5 Stream生成方式
这里写图片描述
Collection接口新增了default方法来获取stream,只要实现了Collection接口的都可以通过该方法获取;
这里写图片描述
Arrays类新增了好几个static方法来获取stream,Arrays可以通过这些方法获取;

总结下来,stream的获取方式如下:

## 1从 Collection 和数组
Collection.stream()
Collection.parallelStream()
Arrays.stream(T array) or Stream.of()
## 2从 BufferedReader
java.io.BufferedReader.lines()
## 3静态工厂
java.util.stream.IntStream.range()
java.nio.file.Files.walk()
## 4自己构建
java.util.Spliterator
## 5其它
Random.ints()
BitSet.stream()
Pattern.splitAsStream(java.lang.CharSequence)
JarFile.stream()


获取Stream:

 //获取流
 //1 Stream.of(val1, val2, val3….)
 System.out.println("-------------Stream.of(val1)-------------");
 Stream<Integer> newStream = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9);
 newStream.forEach(System.out::println);
 //2 Stream.of(arrayOfElements)
 System.out.println("-------------Stream.of(arrayOfEl
Java 8引入了Stream API,它是一种处理集合数据的新方式。Stream API提供了一种流式操作的方式,可以对集合进行过滤、映射、排序、聚合等操作,使得代码更加简洁、易读和高效。 Stream是一个来自数据源的元素队列并支持聚合操作。它可以是集合、数组、I/O channel、产生器等。Stream操作可以顺序执行,也可以并行执行。 Java 8 Stream API的特点包括: 1. 延迟执行:Stream操作通常是延迟执行的,只有在终止操作时才会触发实际的计算。 2. 内部迭代:Stream API使用内部迭代的方式,不需要显式地编写循环,使得代码更加简洁。 3. 函数式编程:Stream API支持函数式编程风格,可以通过Lambda表达式来定义操作。 4. 并行处理:Stream API提供了并行处理的能力,可以充分利用多核处理器的优势,提高处理速度。 使用Stream API可以通过一系列的中间操作和终止操作来对集合进行处理。中间操作包括过滤、映射、排序等操作,终止操作包括聚合、收集、遍历等操作。 下面是一些常用的Stream操作方法: 1. filter(Predicate<T> predicate):根据指定条件过滤元素。 2. map(Function<T, R> mapper):将元素进行映射转换。 3. sorted(Comparator<T> comparator):对元素进行排序。 4. distinct():去除重复的元素。 5. limit(long maxSize):限制元素的数量。 6. skip(long n):跳过指定数量的元素。 7. forEach(Consumer<T> action):对每个元素执行指定操作。 8. collect(Collector<T, A, R> collector):将元素收集到集合中。 9. reduce(BinaryOperator<T> accumulator):对元素进行归约操作。 10. parallel():启用并行处理。 以上只是Stream API的一部分常用操作,还有更多的操作方法可以根据具体需求使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值