如何在Scala中声明性地创建列表?

时间:2011-02-09 13:17:48

标签: scala collections declarative-programming

在C#中,我可以声明性地声明一个列表,换句话说,声明它的结构并在下面同时初始化它:

var users = new List<User>
            {
                new User {Name = "tom", Age = 12}, 
                new User {Name = "bill", Age = 23}
            };

忽略.Net中的List和Scala中的List之间的差异(即,随意使用不同的集合类型),是否可以在Scala 2.8中执行类似的操作?

更新

从下面调整Thomas的代码我相信这是与所示C#代码最接近的代码:

class User(var name: String = "", var age: Int = 0)

val users = List(
  new User(name = "tom", age = 12), 
  new User(name = "bill", age = 23))

4 个答案:

答案 0 :(得分:20)

怎么样:

case class User(name: String, age: Int)

val users = List(User("tom", 12), User("bill", 23))

会给你:

users: List[User] = List(User(tom,12), User(bill,23))

答案 1 :(得分:4)

val users = User("tom", 12) :: User("bill", 23) :: Nil

您也可以使用Scala元组类:

val users = ("tom", 12) :: ("bill", 23) :: Nil

答案 2 :(得分:3)

或者您可以在不使用编译模块中定义的显式类的情况下创建对象

List(
   new {var name = "john"; var age = 18},
   new {var name = "mary"; var age = 21}
)
请注意,此代码有一些严重的缺点,它将为每个new创建一个匿名类。

答案 3 :(得分:1)

从下面调整Thomas的代码我相信这是与所示C#代码最接近的代码:

class User(var name: String = "", var age: Int = 0)

val users = List(
  new User(name = "tom", age = 12), 
  new User(name = "bill", age = 23))

它与C#代码的行为方式略有不同,因为我们提供了一个带有默认值的显式构造函数,而不是使用no args构造函数并随后设置属性,但最终结果具有可比性。