java8新增了stream流的特性,能够让用户以函数式的方式、更为简单的 *** 纵集合等数据结构,并实现了用户无感知的并行计算。
1.2 从零开始实现一个stream流相信很多人在使用过java8的streamAPI接口之后,都会对其实现原理感到好奇,但往往在看到jdk的stream源码后却被其复杂的抽象、封装给弄糊涂了,而无法很好的理解其背后的原理。究其原因,是因为jdk的stream源码是高度工程化的代码,工程化的代码为了效率和满足各式各样的需求,会将代码实现的极其复杂,不易理解。
在这里,我们将抛开jdk的实现思路,从零开始实现一个stream流。
我们的stream流同样拥有惰性求值,函数式编程接口等特性,并兼容jdk的Collection等数据结构(但不支持并行计算 orz)。
相信在亲手实现一个stream流的框架之后,大家能更好的理解流计算的原理。
在探讨探究stream的实现原理和动手实现之前,我们先要体会stream流计算的独特之处。
举个例子: 有一个List列表,我们需要获得年龄为70岁的前10个Person的姓名。
过程式的解决方案:
稍加思考,我们很快就写出了一个过程式的解决方案(伪代码):
ListpersonList = fromDB(); // 获得List int limit = 10; // 限制条件 List nameList = new ArrayList(); // 收集的姓名集合 for(Person personItem : personList){ if(personItem.age == 70){ // 满足条件 nameList.add(personItem.name); // 加入姓名集合 if(nameList.size() >= 10){ // 判断是否超过限制 break; } } } return nameList;
函数式stream解决方案:
下面我们给出一种基于stream流的解决方案(伪代码):
ListpersonList = fromDB(); // 获得List List nameList = personList.stream() .filter(item->item.age == 70) // 过滤条件 .limit(10) // limit限制条件 .map(item->item.name) // 获得姓名 .collect(Collectors.toList()); // 转化为list return nameList;
// 生成整数流 1-10 StreamintStream = IntegerStreamGenerator.getIntegerStream(1,10); // intStream基础上过滤出偶数 Stream filterStream = intStream.filter(item-> item%2 == 0); // filterStream基础上映射为平方 Stream mapStream = filterStream.map(item-> item * item); // mapStream基础上截取前两个 Stream limitStream = mapStream.limit(2); // 最终结果累加求和(初始值为0) Integer sum = limitStream.reduce(0,(i1,i2)-> i1+i2);
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)