带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(1)https://developer.aliyun.com/article/1339970?groupCode=taobaotech
解法
所有上面的这些都可以抽象为:
- 带有状态,且线程安全
- 状态可变,且根据状态的不同,对输入应用不同的操作,产生不同的值
- 可以提前结束、或者对不满足条件的值进行选择性丢弃
- 有完整的生命周期
- 在结束时可以根据内部状态而产生可选的值,而不会丢失内部状态
经过分析,这里可以表达为 : 状态 + 输入 -(应用行为)-> 新的状态 + 输出 , 这样再加上 onCraete、onComplete 生命周期函数,就可以完整表达。而提前结束等行为,则可以通过组合takeWhile
实现。我们将方法命名为:statefulMap,声明如下:
public <S, In, Out> statefulMap( java.util.function.Supplier<S> create, java.util.function.BiFunction<S, In, Pair<S, Out>> f, java.util.function.Function<S, Optional<Out>> onComplete){...}
让我们看一下如何通过这个方法来实现 zipWithIndex吧:
实现zipWithIndex (indexed)
Source.from(Arrays.asList("A", "B", "C", "D")) .statefulMap( () -> 0L, (index, element) -> Pair.create(index + 1, Pair.create(element, index)), indexOnComplete -> Optional.empty()) .runForeach(System.out::println, system); // prints // Pair(A,0) // Pair(B,1) // Pair(C,2) // Pair(D,3)
也可以实现 zipWithNext、zipWithPreviousAndNext 我们再看看如何实现较为复杂的 bufferUntilChanged吧
带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(3)https://developer.aliyun.com/article/1339967?groupCode=taobaotech