[英]Scala flatmap Seq
我有一个数组:Option [Seq [People]]
case class People (
name: Option[String],
tall: Option[Boolean],
fat: Boolean
)
我想要的样子:
String name = "Jack|Tom|Sam"
String tall = "True|True|True"
String fat = "True|False|True"
因此,我尝试:
name = array.flatMap(x => x.name).map(_.mkString("|"))
name = array.flatMap(_.slot_name).map(_.mkString("|"))
上面的尝试没有用。
这是您需要的(在Scala REPL会话中演示):
$ scala
Welcome to Scala 2.12.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_161).
Type in expressions for evaluation. Or try :help.
scala> case class People (
| name: Option[String],
| tall: Option[Boolean],
| fat: Boolean
| )
defined class People
scala> val array = Option(
| Seq(
| People(Some("Jack"), Some(true), true),
| People(Some("Tom"), Some(true), false),
| People(Some("Sam"), Some(true), true),
| )
| )
array: Option[Seq[People]] = Some(List(People(Some(Jack),Some(true),true), People(Some(Tom),Some(true),false), People(Some(Sam),Some(true),true)))
scala> val name = array.fold("")(_.flatMap(_.name).mkString("|"))
name: String = Jack|Tom|Sam
scala> val tall = array.fold("")(_.flatMap(_.tall).map(_.toString.capitalize).mkString("|"))
tall: String = True|True|True
scala> val fat = array.fold("")(_.map(_.fat.toString.capitalize).mkString("|"))
fat: String = True|False|True
每个fold
操作都认为array
的值可以为None
(第一个参数列表,它映射到一个空字符串)。 否则, fold
接受定义的序列(在第二个参数列表中),然后处理每个成员。
flatMap
操作将People
实例转换为相应的必需可选值( name
和tall
),在检索定义的值的同时滤除未定义的值。 ( flatMap
等效于map
后跟flatten
。)由于fat
字段不是可选的,因此仅需要一个map
,而不是flatMap
。
为了匹配所需的输出,必须通过另一个map
操作将结果Boolean
值转换为大写字符串。 (对于fat
,可以将其与将People
实例转换为Boolean
值的map
调用结合使用。)
最后,通过mkString
函数,使用mkString
(“ |”)作为分隔符 ,将所得的Seq[String]
联接为单个String
。
mkString
是Seq[String]
val names = array.map(_.flatMap(x => x.name).mkString("|")).getOrElse("")
val tall = array.map(_.flatMap(_.tall).map(_.toString.capitalize).mkString("|")).getOrElse("")
val fat = array.map(_.map(_.fat.toString.capitalize).mkString("|")).getOrElse("")
这是对元素array
进行collect
另一种方法
val array = Seq(
People(Some("Jack"), Some(true), true),
People(Some("Tom"), Some(true), false),
People(Some("Sam"), Some(true), true)
)
array: Seq[People] = List(People(Some(Jack),Some(true),true), People(Some(Tom),Some(true),false), People(Some(Sam),Some(true),true))
为了获得所有人的名字
scala> val name = array.collect{
case p : People => p.name
}.flatten.mkString("|")
res3: name: String = Jack|Tom|Sam
为了使所有人高个子
scala> val tall = array.collect{
case p: People => p.tall
}.flatten.mkString("|")
tall: String = true|true|true
用同样的方法食用脂肪
scala> val tall = array.collect{
case p: People => p.fat.toString.capitalize
}.mkString("|")
tall: String = True|False|True
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.