很好地创建一个对象列表

时间:2013-11-16 16:02:28

标签: scala scala-collections

我想知道创建List个对象的最好方法是什么。

我能够想出的是将使用过的Range转换为List

val objs: List[String] =
  for (i <- 1.to(100).toList)
    yield new String("" + i)

或将整个结果转换为toList

val objs: List[String] =
  (for (i <- 1 to 100 )
    yield new String("" + i)).toList

但它们对我来说都不够光滑。有没有更简单的方法来做到这一点?变量必须是List类型,因为它在我正在使用的代码中的其他位置使用。提前谢谢!

1 个答案:

答案 0 :(得分:6)

您可以直接在范围内使用toList

(1 to 100).toList

要将Ints转换为字符串,只需使用toString并将其映射到范围:

(1 to 100).map(_.toString).toList

此外,您使用new String("" + i)实际上是多余的。表达式"" + i 已经是一个String,因此您实际上是从现有的String中创建一个新的String。所以你应该只使用现有的String!

如果您真的希望"" + i语法优于toString,那么至少应该这样做:

(1 to 100).map("" + _).toList


编辑:根据您对真正希望摆脱toList电话的评论,您可以使用breakOut。这通过查看期望的类型(在此处等号的左侧指定)并直接创建该类集合来工作。好处是它避免在创建map之前创建一个中间集合(来自List),但它更加丑陋。

val xs: List[String] = (1 to 100).map(_.toString)(breakOut)

或者,如果您需要"" + _语法

val xs: List[String] = (1 to 100).map("" + _)(breakOut)

或者,与你原先想要的for / yield一样:

val xs: List[String] = (for(i <- 1 to 100) yield "" + i)(breakOut)