java8 Stream的实现原理 (从零开始实现一个stream流)

1.从零开始实现stream流

1.1 java8 stream介绍

java8新增了stream流的特性,能够让用户以函数式的方式、更为简单的操纵集合等数据结构,并实现了用户无感知的并行计算。

1.2 从零开始实现一个stream流

相信很多人在使用过java8的streamAPI接口之后,都会对其实现原理感到好奇,但往往在看到jdk的stream源码后却被其复杂的抽象、封装给弄糊涂了,而无法很好的理解其背后的原理。究其原因,是因为jdk的stream源码是高度工程化的代码,工程化的代码为了效率和满足各式各样的需求,会将代码实现的极其复杂,不易理解。
  在这里,我们将抛开jdk的实现思路,从零开始实现一个stream流。
  我们的stream流同样拥有惰性求值,函数式编程接口等特性,并兼容jdk的Collection等数据结构(但不支持并行计算 orz)。
  相信在亲手实现一个stream流的框架之后,大家能更好的理解流计算的原理。

2.stream的优点

在探讨探究stream的实现原理和动手实现之前,我们先要体会stream流计算的独特之处。

举个例子: 有一个List列表,我们需要获得年龄为70岁的前10个Person的姓名。
  过程式的解决方案:

稍加思考,我们很快就写出了一个过程式的解决方案(伪代码):

List<Person> personList = fromDB(); // 获得List<Person>
int limit = 10; // 限制条件
List<String> nameList = new ArrayList(); // 收集的姓名集合
for(Person personItem : personList){
    if(personItem.age == 70){ // 满足条件
        nameList.add(personItem.name); // 加入姓名集合
        if(nameList.size() >= 10){ // 判断是否超过限制
            break;
        }
    }
}
return nameList;

函数式stream解决方案:

下面我们给出一种基于stream流的解决方案(伪代码):

List<Person> personList = fromDB(); // 获得List<Person>
List<String> nameList = personList.stream()
      .filter(item->item.age == 70) // 过滤条件
      .limit(10)    // limit限制条件
      .map(item->item.name) // 获得姓名
      .collect(Collectors.toList()); // 转化为list

return nameList;
      // 生成整数流 1-10
        Stream<Integer> intStream = IntegerStreamGenerator.getIntegerStream(1,10);

        // intStream基础上过滤出偶数
        Stream<Integer> filterStream =  intStream.filter(item-> item%2 == 0);

        // filterStream基础上映射为平方
        Stream<Integer> mapStream = filterStream.map(item-> item * item);

        // mapStream基础上截取前两个
        Stream<Integer> limitStream = mapStream.limit(2);

        // 最终结果累加求和(初始值为0)
        Integer sum = limitStream.reduce(0,(i1,i2)-> i1+i2);
       
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿杰同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值