我有一个像这样与各种类型的列表:斯卡拉 - 扩大不同类型的列表,同时保持相同类型
val data: List[(String, Int, List[String])] = List(("foo", 1, List("a", "b")), ("bar", 2, List("c", "d")), ("baz", 1, List("e", "f")))
那里有一个int值比1大,我试图复制在这个范围内(从1到智力)的项目每个诠释 - 所以最好将看起来像(强调的是,诠释需要递增从1每个迭代INT):
val dataExpanded: List[(String, Int, List[String])] = List(("foo", 1, List("a", "b")), ("bar", 1, List("c", "d")), ("bar", 2, List("c", "d")), ("baz", 1, List("e", "f")))
在scala中处理类型常常会让我头疼,特别是嵌套结构,因为每个操作似乎都会引入越来越多类型的陷阱。
所以虽然我想:
val dataExpanded = data.map{ case (s, i, l) =>
if (i > 1) {
List.range(1, i+1).map { n =>
(s, n, l)
}
} else {
(s, i, l)
}
}
我得到的结果是:
> dataExpanded: List[Product with java.io.Serializable] = List((foo,1,List(a, b)), List((bar,1,List(c, d)), (bar,2,List(c, d))), (baz,1,List(e, f)))
结果看起来是在正确的道路上,但扩展元素嵌套在其自己的名单,结果,我认为,类型是错误的。没有多少flatMapping或flattening或映射的for循环的输出是让我走出这堵塞。
这也可能与我的病例陈述并没有处理无病例,但我不知道如何处理其他病例(我知道这是不正确的说,但我不会真的有任何其他病例我的数据案例 - 虽然这是动态类型的语言说话醉)
当从data
到dataExpanded
时,有没有一种方法来保持预期的类型,同时避免不必要的循环?
的问题是,所述类型是的如果/其他两个分支的不同(与[严格编译器参数](http://tpolecat.github.io/ 2014/04/11/scalac-flags.html)这将是一个错误,这可能会帮助你找到问题)。你可以使'else'分支'List((s,i,l))',然后你只需要'变平'。虽然从建议中可以看出,你根本不需要'if' /'else' - 即使在'i = 1'时,'if'分支中的代码也能正常工作。 – lmm