Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Scala中创建查找映射_Scala_Collections_Functional Programming - Fatal编程技术网

如何在Scala中创建查找映射

如何在Scala中创建查找映射,scala,collections,functional-programming,Scala,Collections,Functional Programming,虽然我知道有几种方法可以做到这一点,但我最感兴趣的是找到最惯用、最实用的Scala方法 给出以下陈腐的例子: case class User(id: String) val users = List(User("1"), User("2"), User("3"), User("4")) 创建user.id->user的不可变查找映射的最佳方法是什么,以便我可以按user.id执行快速查找 在Java中,我可能会使用Google Collection,尽管它的独特属性我不太关心。您可以将用户保

虽然我知道有几种方法可以做到这一点,但我最感兴趣的是找到最惯用、最实用的Scala方法

给出以下陈腐的例子:

case class User(id: String)
val users = List(User("1"), User("2"), User("3"), User("4")) 
创建user.id->user的不可变查找映射的最佳方法是什么,以便我可以按user.id执行快速查找


在Java中,我可能会使用Google Collection,尽管它的独特属性我不太关心。

您可以将用户保存在列表中并使用列表。查找:

users.find{_.id == "3"} //returns Option[User], either Some(User("3")) or None if no such user
或者,如果要使用映射,请将用户列表映射到2元组列表,然后使用toMap方法:

val umap = users.map{u => (u.id, u)}.toMap
它将返回一个不可变的映射[String,User],然后您可以使用

umap contains "1" //return true


如果您确定所有ID都是唯一的,那么规范的方法是

users.map(u => (u.id, u)).toMap
正如丹·西蒙所说。但是,如果您不确定所有ID都是唯一的,那么规范方法是:

users.groupBy(_.id)
这将生成从用户ID到共享该ID的用户列表的映射

因此,有一种不完全规范的替代方法来生成从ID到单个用户的映射:

users.groupBy(_.id).mapValues(_.head)
对于那些希望避免创建列表映射的中间步骤,或者创建一个列表然后将其转换为映射的专家用户,有一种方便的
scala.collecion.breakOut
方法,如果有一种简单的方法,它可以构建您想要的类型。但是,它需要知道类型,因此这将实现以下目的:

users.map(u => (u.id,u))(collection.breakOut): Map[String,User]

(您也可以分配给指定类型的var或val。)

如果您想使用数字索引:

scala> users.map (u=> u.id.toInt -> u).toMap 
res18: scala.collection.immutable.Map[Int,User] =
  Map((1,User(1)), (2,User(2)), (3,User(3)))

映射也是函数,它们的apply方法提供了对与特定键相关联的值的访问(或者为未知键抛出NoSuchElementException),因此这使得查找语法非常简洁。根据Dan Simon的回答,使用一个更具语义意义的名称:

scala> val Users = users map {u  => (u.id, u)} toMap      
Users: scala.collection.immutable.Map[String,User] = Map((1,User(1)), (2,User(2)), (3,User(3)))
然后提供以下查找语法:

scala> val user2 = Users("2")
user2: User = User(2)

将列表转换为地图并将其用作函数:

  case class User(id: String)
  val users = List(User("1"), User("2"), User("3"))

  val usersMap = users map { case user @ User(id) => id -> user } .toMap

  usersMap("1")    // Some(User("1"))
  usersMap("0")    // None
  case class User(id: String)
  val users = List(User("1"), User("2"), User("3"))

  val usersMap = users map { case user @ User(id) => id -> user } .toMap

  usersMap("1")    // Some(User("1"))
  usersMap("0")    // None