上一篇文章,小乐给大家介绍了《 Java8新特性之方法引用 》,下面接下来小乐将会给大家介绍Java8新特性之Stream,称之为流,本篇文章为上半部分。
Java Se中对于流的操作有输入输出IO流,而Java8中引入的Stream 属于Java API中的一个新成员,它允许你以声明性方式处理数据集合,Stream 使用一种类似 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。 注意这里的流操作可以看做是对集合数据的处理。
简单来说,流是一种数据渠道,用于操作数据源(集合、数组)所生产的元素序列。
整个流操作就是一条流水线,将元素放在流水线上一个个地进行处理。需要注意的是:很多流操作本身就会返回一个流,所以多个操作可以直接连接起来, 如下图这样,操作可以进行链式调用,并且并行流还可以实现数据流并行处理操作。
Stream 和集合的其中一个差异在于什么时候进行计算,集合,它会包含当前数据结构中所有的值,你可以随时增删,但是集合里面的元素毫无疑问地都是已经计算好了的。 流则是按需计算,按照使用者的需要计算数据,你可以想象我们通过搜索引擎进行搜索,搜索出来的条目并不是全部呈现出来的,而且先显示最符合的前 10 条或者前 20 条,只有在点击 “下一页” 的时候,才会再输出新的 10 条。
5.3.2、外部迭代与内部迭代
把集合比作一个工厂的仓库,一开始工厂比较落后,要对货物作什么修改,只能工人亲自走进仓库对货物进行处理,有时候还要将处理后的货物放到一个新的仓库里面。在这个时期,我们需要亲自去做迭代,一个个地找到需要的货物,并进行处理,这叫做外部迭代。
后来工厂发展了起来,配备了流水线作业,只要根据需求设计出相应的流水线,然后工人只要把货物放到流水线上,就可以等着接收成果了,而且流水线还可以根据要求直接把货物输送到相应的仓库。这就叫做内部迭代,流水线已经帮你把迭代给完成了,你只需要说要干什么就可以了(即设计出合理的流水线)。
Java 8 引入 Stream 很大程度是因为,流的内部迭代可以自动选择一种合适你硬件的数据表示和并行实现。
在 Java 8 中, 集合接口有两个方法来生成流:
示例代码如下:
public static void main(String[] args) { /** * 定义集合l1 并为集合创建串行流 */ List<String> l1 = Arrays.asList("周星驰", "周杰伦", "周星星", "周润发"); // 返回串行流 l1.stream(); // 返回并行流 l1.parallelStream(); }
上述操作得到的流是通过原始数据转换过来的流,除了这种流创建的基本操作外,对于流的创建还有以下几种方式。
Stream.of(T...) : Stream.of("aa", "bb") 生成流 //值创建流 生成一个字符串流 Stream<String> stream = Stream.of("java8", "Spring", "SpringCloud"); stream.forEach(System.out::println);
根据参数的数组类型创建对应的流。
// 只取索引第 1 到第 2 位的: int[] a = {1, 2, 3, 4}; Arrays.stream(a, 1, 3).forEach(System.out :: println);
//每个元素是给定文件的其中一行 Stream<String> stream02 = Files.lines(Paths.get("data.txt"));
两个方法:
//生成流,首元素为 0,之后依次加 2 Stream.iterate(0, n -> n + 2) //生成流,为 0 到 1 的随机双精度数 Stream.generate(Math :: random) //生成流,元素全为 1 Stream.generate(() -> 1)
上半部分就介绍到这里,下半部分将会给大家介绍流的中间操作和终止操作。请多关注!转载请注明出处和作者。