大部分聚合器都是基于 Reduce 操作实现的。 Reduce ,名曰推导,含有三个要素: 初始值 init, 二元操作符 BinaryOperator, 以及一个用于聚合结果的数据源S。
首先使用 ArrayList::new 创造一个空列表; 然后 List:add 将Stream累积操作的中间结果加入到这个列表;第三个函数则将两个列表元素进行合并成一个结果列表中。 就是这么简单。集合聚合器 toSet(), 字符接器 joining(),以及列表求和(summingX)、最大(maxBy)、最小值(minBy)等都是这个套。
Spliterator 用来对流中的元素进行分区和遍历以及Sink指定操作,可以用于并发计算。Spliterator的具体实现类定义在 Spliterators 的静态类和静态方法中。其中有:
函数编程的一大益处,是用更精练的代码表达常用数据处理模式。函数接口能够轻易地实现模板方法模式,只要将不确定的业务逻辑抽象成函数接口,然后传入不同的lambda表达式即可。博文精练代码:一次Java函数式编程的重构之旅 展示了如何使用函数式编程来重构常见代码,萃取更多可复用的代码模式。
使用函数接口,结合泛型,很容易用精练的代码,写出非常通用的工具方法。 实际应用中,常常会有这样的需求: 有两个对象列表srcList和destList,两个对象类型的某个字段K具有相同的值;需要根据这个相同的值合并对应的两个对象的信息。
这里给出了一个列表合并函数,可以将一个对象列表合并到指定的对象列表中。实现是: 先将待合并的列表srcList根据key值函数keyFunc构建起srcMap,然后遍历dest列表的对象R,将待合并的信息srcMap[key]及T通过合并函数mergeFunc生成的新对象R添加到最终结果列表。
使用函数接口可以方便地隔离外部依赖,使得类和对象的方法更纯粹、更具可测性。博文使用Java函数接口及lambda表达式隔离和模拟外部依赖更容易滴单测,改善代码可测性的若干技巧集中讨论了如何使用函数接口提升代码的可单测性。
前面提到,函数接口就是数据转换器。比如FunctionT,R 就是将T对象转换成R对象的行为或数据转换器。对于实际工程应用的普通级函数编程足够了。不过,要玩转函数接口,就要升级下认识。 比如 FunctionBiFunctionS,Q,R, FunctionT,R 该怎么理解呢?这是一个一元函数g(h(s,q)) ,参数指定的二元函数h(s,q)应用于指定的两个参数S,Q,得到一个一元函数f(t),这个函数接收一个T对象,返回一个R对象。 如下代码所示:
本文深入学习了Java8函数式编程框架:Function&Stream&Collector,并展示了函数式编程在实际应用中所带来的诸多益处。函数式编程是一把大锋若钝的奇剑。基于函数接口编程,将函数作为数据传递,结合泛型推导能力,可编写出精练、通用、易测的代码,使代码表达能力获得飞一般的提升。返回,查看更多
网友评论 ()条 查看