входного внутри Flow:
fun <T> Flow<List<T>?>.filterListElements(predicate: (T) -> Boolean): Flow<List<T>?> =
map { list -> list?.filter(predicate) }
Не совсем понял, какую именно зависимость вы хотите выразить
Я хочу если на входе Flow с ненулябельнным листом Flow<List<T>>, то и на выходе Flow<List<T>>, а если на входе Flow<List<T>?>, то и на выходе Flow<List<T>?>
fun <T, B : List<T>?> Flow<B>.filterListElements(predicate: (T) -> Boolean): Flow<B> = map { list -> list?.filter(predicate) }
Пробовал, он ругается Type mismatch. Required: Flow<B> Found: Flow<List<T>?>
ну да, потому что map только лист возвращает, хм, тогда даже не знаю
И написать два расширения нельзя((
Проще, чем в примере ниже, врядли у вас получится (в примере Sequence, а не Flow, но это не критично для идеи). fun <T> Sequence<List<T>>.filterListElements(predicate: (T) -> Boolean): Sequence<List<T>> = map { it.filter(predicate) } @JvmName("filterListElementsNullable") fun <T> Sequence<List<T>?>.filterListElements(predicate: (T) -> Boolean): Sequence<List<T>?> = map { it?.filter(predicate) } fun main() { val filterListElements = sequenceOf(listOf(1), listOf(2)).filterListElements { it < 3 } val filterListElementsNullable = sequenceOf(listOf(1), listOf(2), null).filterListElements { it < 3 } println(filterListElements.toList()) println(filterListElementsNullable.toList()) }
Можно ещё так, но с анчекд кастами: @Suppress("UNCHECKED_CAST") fun <T, L : List<T>?> Sequence<L>.filterListElements(predicate: (T) -> Boolean): Sequence<L> = map { (it as? List<T>)?.filter(predicate) } as Sequence<L>
Можно упростить до: @Suppress("UNCHECKED_CAST") fun <T, L : List<T>?> Sequence<L>.filterListElements(predicate: (T) -> Boolean): Sequence<L> = map { it?.filter(predicate) } as Sequence<L>
Компилятор ругается Kotlin: Type inference failed: inline fun <T> Iterable<T#1 (type parameter of kotlin.collections.filter)>.filter(predicate: (T#1) -> Boolean): List<T#1> cannot be applied to receiver: L arguments: ((T#2 (type parameter of filterListElements)) -> Boolean)
Странно, у меня работает: https://pl.kotl.in/QvAjjQXiS
Обсуждают сегодня