Kotlin 将 List<Triple<String, String, String> 变异为 Triple<List<String>, List<String>, List<String>> 的优雅方式

Dan*_*ini 3 monads functional-programming monad-transformers kotlin arrow-kt

我想尽可能简洁地(但清楚地)将 a 转换List<Triple<String, String, String>为 a Triple<List<String>, List<String>, List<String>>

例如,假设执行转换的方法被调用turnOver,我希望:

val matches = listOf(
  Triple("a", "1", "foo"),
  Triple("b", "2", "bar"),
  Triple("c", "3", "baz"),
  Triple("d", "4", "qux")
)
val expected = Triple(
  listOf("a", "b", "c", "d"),
  listOf("1", "2", "3", "4"),
  listOf("foo", "bar", "baz", "qux")
)
matches.turnOver() == expected // true
Run Code Online (Sandbox Code Playgroud)

如何编写简洁、清晰且可能具有turnOver功能性的函数?

可以使用 Arrow-Kt,我已经将其作为项目依赖项。

asc*_*sco 7

fun turnOver(matches: List<Triple<String, String, String>>) = Triple(
   matches.map { it.first },
   matches.map { it.second },
   matches.map { it.third },
)
Run Code Online (Sandbox Code Playgroud)

我认为将是一个明显的解决方案。

  • 很好,但在我看来,我正在考虑一个更通用的解决方案,其中代码不会随着元组大小而增长。我相信在函数式编程中一定有一种习惯用法来进行这种展开。 (3认同)