热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在Kotlin中有效地展平任何一个列表

我有一个类似这样的列表,List<Either<Failure,List<MyResult>>>并想将其展平为E

我有一个类似这样的列表,List>>并想将其展平为Either>使用 Arrow-kt,但我尝试过的所有内容似乎都很笨重,最终遍历列表两次。感觉应该有更好的方法,但我想不通。这是我现在拥有的一个人为的例子:

val things : List = /* some stuff */
val results : List>> = things.map { doThingThatReturnsEither(it) }
val successes : List = results.mapNotNull { it.orNull() }.flatten()
val firstFailure : Failure? = results.mapNotNull { it.swap().orNull() }.firstOrNull()
return firstFailure?.let {it.left()} ?: success.right()

欢迎任何建议!

额外问题:things.map { }如果其中一个返回 ,是否有捷径Left

回答


您正在寻找的功能是 sequence

val res:Either> = results.sequence(Either.applicative())
.fix()
.map { it.fix() }

这将在第一个Failure(如果有)上短路并将其返回到左边,或者给你所有的MyResult列表。

fix()map { it.fix() },是因为较高的kinded类型的箭的仿真的需要。



  • I had to `flatten()` in the extra `map` to get my desired results but this is way better than what I had before thanks.





推荐阅读
author-avatar
胡鹏锦_289
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有