簡體   English   中英

Scala平面圖序列

[英]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實例轉換為相應的必需可選值( nametall ),在檢索定義的值的同時濾除未定義的值。 flatMap等效於map后跟flatten 。)由於fat字段不是可選的,因此僅需要一個map ,而不是flatMap

為了匹配所需的輸出,必須通過另一個map操作將結果Boolean值轉換為大寫字符串。 (對於fat ,可以將其與將People實例轉換為Boolean值的map調用結合使用。)

最后,通過mkString函數,使用mkString (“ |”)作為分隔符 ,將所得的Seq[String]聯接為單個String

mkStringSeq[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM