Существуют ли элегантные способы превратить Список в NonEmptyList в kotlin и arrow?
fun main() {
val list = listOf(1, 2, 3, 4, 5)
if (list.isNotEmpty()) {
Nel(list[0], list.subList(1, list.lastIndex))
}
}
Согласно документам стрелка, кажется, сможет сделать это через Semigroup
или же Monad binding
, Тем не менее, нет кода для замены List
с NonEmptyList
,
Есть ли лучший способ заменить List
сNonEmptyList
без использования subList
?
2 ответа
Решение
Есть сопутствующая функция fromList
что вернуть Option<NonEmptyList>
или если вы уверены, что используете fromListUnsafe
:
val list = listOf(1, 2, 3, 4, 5)
val nelistOption = NonEmptyList.fromList(list)
val nelist = NonEmptyList.fromListUnsafe(list)
В Arrow 1.1.3 представлен более идиоматический способ Колтина для достижения этой цели с введением Iterable.toNonEmptyListOrNull(): NonEmptyList?
Пример:
val list: List<Int> = listOf(1, 2, 3)
val nonEmptyList: NonEmptyList<Int>? = list.toNonEmptyListOrNull()
Чтобы получить старыйOption
можно использоватьtoOption()
функция расширения
val list: List<Int> = listOf(1, 2, 3)
val nonEmptyList: Option<NonEmptyList<Int>> = list.toNonEmptyListOrNull().toOption()
или используйте Option.fromNullable()
val list: List<Int> = listOf(1, 2, 3)
val nonEmptyList: Option<NonEmptyList<Int>> = Option.fromNullable(list.toNonEmptyListOrNull())
Функция NonEmptyList.fromList() теперь устарела в пользу toNonEmptyListOrNull.