如果列表不为空或返回空列表,则返回尾部

Zot*_*tov 8 scala

从电子邮件列表中我得到2个值:

  • 列表头部的选项
  • 其余人的名单

在scala中对此进行编码的惯用方法是什么?到目前为止,我有:

val primaryEmail = emails.headOption
val conf = Map[String, Any](
  "email" -> primaryEmail,
  "additionalEmails" -> 
     primaryEmail.map(_ => emails.tail).getOrElse(List())
)
Run Code Online (Sandbox Code Playgroud)

编辑:至于为什么有Any:我们使用GSON进行json序列化,并在内部将所有集合转换为java集合并将它们传递给jsonSerializationContext.serialize,它们将java.lang.Object作为参数,所以很Any适合我们.

Jen*_*olm 17

我可能只是drop第一个元素(如果你确定第一个元素总是主要的电子邮件).像这样:

val conf = Map[String, Any](
  "email" -> emails.headOption,
  "additionalEmails" -> emails.drop(1)
)
Run Code Online (Sandbox Code Playgroud)

如果主电子邮件不在列表中(列表为空),则不会出现异常.


oxb*_*kes 8

了解一个scalaz.所有这些都可以在一个电话中找到:

val (primary, rest) =  list <^> (nel => some(nel.head) -> nel.tail)
val conf = Map("email" -> primary, "additionalEmails" -> rest)
Run Code Online (Sandbox Code Playgroud)

示范:

scala> val list = List(1, 2, 3)
list: List[Int] = List(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

如果非空

scala> val (primary, rest) =  list <^> (nel => some(nel.head) -> nel.tail)
primary: Option[Int] = Some(1)
rest: List[Int] = List(2, 3)
Run Code Online (Sandbox Code Playgroud)

如果为空:

scala> val list = List.empty[Int]
list: List[Int] = List()

scala> val (primary, rest) =  list <^> (nel => some(nel.head) -> nel.tail)
primary: Option[Int] = None
rest: List[Int] = List()
Run Code Online (Sandbox Code Playgroud)

这是如何运作的?

<^>电话说:如果此列表为空,则返回的类型由返回类型功能的权利定义.如果列表非空,则将该函数应用于该列表

nel是a NonEmptyList,我可以安全地调用headtail,而不用担心它们会抛出异常.我的函数返回一个(Option[A], List[A])

当然,这个只是(None, Nil)为了任何A