前言
关于流式调用,熟悉Java的小伙伴可能第一时间都会想到Java8关于stream相关的API,类似这种的代码list.stream().map(item->item+1).colletion(Collector::toList)
,流式调用带给我们的直接感受是代码量的减少。但是由于Java的特性导致一旦流式代码过长或者封装的不好会导致可读性急剧下降。这里我想要分享一个scala中基于隐式转换的流式调用,来帮助我们将结构更清晰化,聚焦核心代码逻辑的应用。
示例
以下我会用一个简单的代码片段来比较java和scala中流式调用的异同,以及隐式转换给我带来了什么便利。
Java版本
这里我实现加减乘除的流式调用作为例子。在java中一个封装好的流式调用可能如下所示,这里可以看到我需要生命一个类来承载我的流式方法,并且需要提供一个获取结果的方法,每次流式调用返回的都是一个EnrichInteger对象,只有最终获取结果时会返回真正需要的对象类型。其实这里和上面stream list.stream().map(item->item+1).collet(Collector::toList)
的用法是类似的,stream的转换算子每次返回的也是stream流,最终通过一个生成结果的方法来获取对应的数据类型。
public class JavaTest {
public static void main(String[] args) {
int a = 10;
final int result = new EnrichInteger(a)
.add(10)
.divide(2)
.multiple(3)
.minus(5)
.getInt();
System.out.println(result);
}
static class EnrichInteger {
private int self;
public EnrichInteger(int self) {
this.self = self;
}
public EnrichInteger add(int value) {
self = self + value;
return this;
}
public EnrichInteger minus(int value) {
self = self - value;
return this;
}
public EnrichInteger divide(int value) {
self = self / value;
return this;
}