gpt4 book ai didi

带有泛型的 Kotlin 构造函数引用

转载 作者:IT老高 更新时间:2023-10-28 13:46:03 25 4
gpt4 key购买 nike

我在 (Rx)Java 中有这段代码:

Observable.fromArray(1, 2, 3)
.flatMap(this::intToBooleanObservable, Pair::new)
.....

我希望对应的 Kotlin 代码看起来像:

Observable.fromArray(1, 2, 3)
.flatMap(::intToBooleanObservable, ::Pair)
.....

但是编译器无法推断 Pair 的泛型类型,所以我现在能做的最好的事情是:

.flatMap(::intToBooleanObservable, { a, b -> a to b })

这并不像我希望的那样简洁。

有没有办法在不声明变量 ab 的情况下实现这一点?

最佳答案

这里也有同样的问题。其他一些解决方法(按照我使用它们的顺序),您可能会喜欢其中的一种。

1) 编写自己的运算符:

fun <T, U> Single<T>.flatMapPair(func: (T) -> Single<U>) : Single<Pair<T, U>> {
return this.flatMap { t -> func.invoke(t).map { u -> t to u } }
}

2) 将包装移动到条件 Observable(此处为 intToBooleanObservable),将结果作为 Pair 或更明确和自定义的类型(具有 2 个子对象的密封类,如 Success 和 Failure)返回。这可以启用更明确的代码:

 when(it) {
is Success -> ...
is Failure -> ...
}

3) 根据 intToBooleanObservable 结果,您现在有 2 个不同的场景(我想)。通常一个是一种失败/否认,快速解决。为此,编写一个带有副作用的过滤器,其中谓词是一个 Observable,从而避免了这个问题:

fun <T> Observable<T>.filterSingle(predicate: (T) -> Single<Boolean>, rejectionFunction: (T) -> Unit): Observable<T> = ... //filter with the given predicate, and call rejectionFunction if item doesn't pass

4) 最后一种方法仅适用于 bool 结果。如果我对失败/拒绝提供有意义信息的原因感兴趣怎么办?为了同质代码,我删除了这个操作符。受其他函数式语言的启发,我定义了 Either 类型并定义了泛型 Either+RxJava 运算符; mapRight、flatMapRight 和更重要的 dropLeft。 dropLeft 就像 filterSingle 的泛化。

inline fun <L, R> Observable<Either<L, R>>.dropLeft(crossinline sideEffect: (L) -> Unit): Observable<R> = this.lift { downObserver ->
object: Observer<Either<L, R>> {
override fun onError(throwable: Throwable?) = downObserver.onError(throwable)

override fun onSubscribe(disposable: Disposable?) = downObserver.onSubscribe(disposable)

override fun onComplete() = downObserver.onComplete()

override fun onNext(either: Either<L, R>) = when (either) {
is Right -> downObserver.onNext(either.value)
is Left -> sideEffect(either.value)
}
}
}

希望对您有所帮助。

关于带有泛型的 Kotlin 构造函数引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44425274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com