Как типизировать безопасно уменьшить коллекцию "либо до правого"
Может быть, глупый вопрос, но я просто не понимаю.
у меня есть Set<Either<Failure, Success>>
и хотите вывести Set<Success>
со стрелкой-кт.
1 ответ
Вы можете отобразить набор следующим образом:
val successes = originalSet.mapNotNull { it.orNull() }.toSet()
или если вы хотите левые:
val failures = originalSet.mapNotNull { it.swap().orNull() }.toSet()
Финал toSet()
необязательно, если вы хотите сохранить его как Set
как mapNotNull
является функцией расширения на Iterable
и всегда возвращает List
PS: глупых вопросов нет:)
Обновление: это можно сделать, избегая nullables
:
val successes = originalSet
.map { it.toOption() }
.filter { it is Some }
.toSet()
Мы могли бы потенциально добавить Iterable<Option<A>>.filterSome
а также Iterable<Either<A, B>.mapAsOptions
функции.
Обновление 2:
Этот последний пример возвращает Set<Option<Success>>
, Если вы хотите развернуть результаты без использования null
то одна вещь, которую вы можете попробовать, это сложить Set
:
val successes = originalSet
.fold(emptySet<Success>()) { acc, item ->
item.fold({ acc }, { acc + it })
}
Этот последний вариант (непреднамеренный каламбур) не требует использования Option
,