Как типизировать безопасно уменьшить коллекцию "либо до правого"

Может быть, глупый вопрос, но я просто не понимаю.

у меня есть 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,

Другие вопросы по тегам