JDK8 Stream 流式操作分析

原创文章, 转载请私信. 订阅号 tastejava 学习加思考, 仔细品味java之美

Stream 是什么, 能干什么

要熟练使用 Stream 首先要知道什么是 Stream , 下方为源码注释原文

A sequence of elements supporting sequential and parallel aggregate operations.
一个包含元素的序列, 支持序列化或者并行的聚集操作

即 Stream 是元素的容器, 有些像 Collection, 但是 Stream 的专注点在于怎么操作处理元素, 而不是存储, 在 Stream 操作元素后最终会聚集成 Collection 或最终要的结果. Stream 只是为了操作元素而生的一个临时的容器.

Stream 实例的创建

要想使用 Stream 首先要获得其实例, 总共有五类方法可以获得Stream实例

  1. Stream.of(T t)
  2. Stream.of(T… values)
  3. Stream.generate(Supplier<T> s)
  4. Stream.iterate(final T seed, final UnaryOperator<T> f)
  5. Collection 所有子类的 parallelStream() 或 stream() 方法

上方五种方式获取 Stream 实例代码以及解释如下(需要了解JDK提供的函数式接口):

log.info("第一部分 Stream 实例的获取方式");
// Stream.of 单参数方法生成实例
Stream.of("Wonderful stream !")
		.forEach(System.out::println);
// Stream.of 可变参数方法生成实例
Stream.of("Wonderful ", "Stream ", "!")
		.forEach(System.out::print);
// 方法引用获得 println 方法, 为了打印一个换行符 : )
Consumer<String> consumer = System.out::println;
consumer.accept("");
// generate 方法生成无限长度流
Stream.generate(Math::random)
		.limit(2)
		.forEach(System.out::println);
// Collection default 方法生成流, Collection 的所有子类都可以获得 Stream
List<Double> collect = Stream.generate(Math::random)
		.limit(2)
		.collect(Collectors.toList());
collect.parallelStream()
		.forEach(System.out::println);
// iterate 方法生成无限长度流, 第一个参数作为 seed, 
// 第二个参数是个 UnaryOperator 一元操作符
Stream.iterate(1, seed -> seed + 1)
		.limit(2)
		.forEach(System.out::println);

需要注意的是, 上面获取 Stream 实例的方法中, 如果 Stream 实例的数据源自容器 Collection 的子类时, 相应的获取流实例的方法会将容器中的元素取出来构造实例, 而不是把整个 Collection 放进流.

Stream 的使用

Stream实例的操作

我们已经知道怎么获取 Stream 实例, 那么接下来的问题就是怎么使用 Stream 实例, 有人就是怎么操作 Stream 实例中的元素.
Stream 提供很多方法操作实例的元素, 这些操作都支持链式操作, 即进行一个流操作后返回的结果也是 Stream 实例, 并且把旧的实例关闭废弃掉. 常见的操作 Stream 实例的方法有以下几种:

  1. distinct
  2. filter
  3. map
  4. flatMap
  5. peek
  6. limit
  7. skip

distinct 用于去除流中的重复元素, 实际效果如下:

// distinct 方法, 过滤出流中不同的元素, 依赖对象的equals方法
// 输出结果为 a c b null 即去除了重复元素
Stream.of("a", "c", "a", "b", "b", null, null)
		.distinct()
		.forEach(System.out::println);

filter 用于自定义过滤规则, 接收一个 Predicate 断言类型参数, 这个参数符合接收一个元素, 符合要求返回 true, 否则返回 false, 返回 true 则当前元素会保留在新的流实例中, 实际效果如下:

// filter 对 Stream 进行自定义过滤, 参数是一个 Predicate 断言类型
// 下方筛选出不同元素, 并且值不是b的元素, 注意 St
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值