Java8新特性stream的原理和使用

这是一种流式惰性计算,整体过程是:
在这里插入图片描述
stream的使用也异常方便,可以对比如List、Set之类的对象进行流式计算,挑出最终想要的结果:

List<Timestamp> laterTimes = allRecords.stream()
                .map(Record::getTime)
                .filter(createdTime -> createdTime.compareTo(threshold) > 0)
                .distinct()
                .sorted()
                .limit(100)
                .collect(Collectors.toList());

看起来好像是一个个方法顺序对所有的操作(map、filter、distinct。。。)执行,实际上不是,因为效率上是无法接受的,其基本思想是在一次迭代中尽可能多的执行用户指定的操作。
Stream上的所有操作分为两类:

  • 中间操作只是一种标记,只有结束操作才会触发实际计算(也就是惰性计算,一个Stream转换为另一个Stream时,实际上只存储了转换规则,并没有任何计算发生)。中间操作又可以分为无状态的(Stateless)和有状态的(Stateful)
    • 无状态中间操作是指元素的处理不受前面元素的影响
    • 有状态的中间操作必须等到所有元素处理之后才知道最终结果,比如排序是有状态操作,在读取所有元素之前并不能确定排序结果
  • 结束操作又可以分为短路操作和非短路操作
    • 短路操作是指不用处理全部元素就可以返回结果,比如找到第一个满足条件的元素
    • 非短路操作就是得处理所有元素才行
      在这里插入图片描述
      最终的结果肯定也是要接收的,咋接收的呢,你想想既然list、map之类的能转换为stream,那stream肯定也能转换为list、map之类的东西:
List<String> listResult = list.stream().collect(Collectors.toList());
Map<String, Integer> mapResult = list.stream()
                .collect(Collectors.toMap(Function.identity(), String::length));
  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值