前言

其实,Stream很简单,如果你感到困难的话,不妨换个角度去理解它。任何新东西都不是凭空产生的,而是缘于某种旧东西的升华和改造,不妨把Stream当做高级版的 Iterator,那么将大幅拉近Stream与你的感情距离。

1、Stream入门简介

Java 8 添加了一个新的功能称为Stream,中文译为“流”,它将要处理的元素(对象)集合看作一种流。

Stream流表示元素(对象)集合的流动序列,是Java对象的流动,不同于Java I/O中的数据流。我们知道,Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。

2、Stream流与Iterator迭代器的区别和联系

Stream 不是集合元素,更不是数据结构也不保存数据,它是有关算法和计算的,是一种思维模式和处事格局,它更像一个高级版本的 Iterator。

原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;而高级版本的 Stream,用户只要给出需要对其包含的元素执行什么操作,Stream 会隐式地在内部进行遍历,做出相应的数据转换。如下所示:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10,10);
 
Stream<Integer> newStream = stream.filter(s -> s > 5) //6 7 8 9 10 10
        .distinct() //6 7 8 9 10
        .skip(2) //8 9 10
        .limit(2); //8 9
newStream.forEach(System.out::println);

上述代码很简单,首先过滤小于5的数字,然后去重,最后“掐头去尾”。

通过上面的例子,大家可以看到,Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了,就好比流水从面前流过,一去不复返。

3、Stream流的思想追溯

任何东西都不会凭空产生的,那么Stream流的起源是什么呢?我个人猜测是这样的:
(1)Iterator思想的升华而来。
(2)SQL思想的升华而来。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。

4、Stream的操作步骤

Stream有如下三个操作步骤:

第一步:创建Stream。

从一个数据源(如集合、数组)中获取流。例如:

(1)使用Collection下的 stream() 方法

List<String> list = newArrayList<>();

Stream<String> stream = list.stream(); //获取一个顺序流

(2)使用Arrays中的stream()方法,将数组转成流:

Integer[] nums = new Integer[10];

Stream<Integer> stream =Arrays.stream(nums);

(3)使用Stream中的静态方法of()等:

Stream<Integer> stream =Stream.of(1,2,3,4,5,6);

流的创建方式有很多,大家根据自己的情况选择学习一下就行了。以我为例,我对数组比较有兴趣,所以我会记住Arrays.stream(nums),Stream.of(1,2,3,4,5,6),list.stream()这些,大家可以根据自己的情况选择感兴趣的记在心里就可以了。反正,肯定要在心里记住点什么。

第二步:中间操作。

一个操作的中间链,对数据源的数据进行操作。常见的操作有:
(1)filter:过滤流中的某些元素
(2)limit(n):获取n个元素
(3)skip(n):跳过n元素,配合limit(n)可实现分页
(4)distinct:通过流中元素的 hashCode() 和 equals() 去除重复元素

第三步:终止操作。

天下没有不散的宴席,数据经过中间加工操作,就轮到终止操作符上场了;终止操作符就是用来对数据进行收集或者消费的,数据到了终止操作这里就不会向下流动了,终止操作符只能使用一次。常见的终止操作有:
(1)count:统计操作,统计最终的数据个数。
(2)findFirst、findAny:查找操作,查找第一个、查找任何一个 返回的类型为Optional。
(3)min、max:最值操作,需要自定义比较器,返回数据流中最大最小的值。

5、后记

Stream的内容并不是很多,能掌握文中介绍就足以。如果在工作中碰到其他的场景而无从下手,剩下事情就交给“度娘”吧。

本文的主题是“简单介绍”,简单但是不肤浅。如果你仅仅记住Stream的使用规范,这并不是一个高效的学习方式,应该归入自己的知识体系,挂靠在某个节点之下,这样才能体会到文字背后的内涵。

标签: none

添加新评论