我有以下代码:
val rows: Iterator[Map[String,String]] = CSVDictReader(file.getInputStream)
val parsedProducts = rows.map(x => Product(name = x.get("NAME"), id = x.get("ID")))
我想用空字符串替换地图条目。只用地图我就可以使用:
filter(_._2.trim.nonEmpty)
如果没有引入一些辅助函数来返回None,我无法理解如何以一种很好的方式执行此操作,以防值为空字符串。
编辑:在我的示例中,我只有名称和ID,但在实际代码中,有十几列数据。另外,我需要使用None而不是空字符串值。所以name = Option(“”)应替换为name = None
答案 0 :(得分:1)
您也可以过滤Option
。
假设您的x.get("NAME")
返回Some("")
甚至Some(" ")
。
然后你可以这样做:x.get("NAME").filter(_.trim.nonEmpty)
希望我能正确理解你的问题
答案 1 :(得分:0)
这样的事情?
val rows: Iterator[Map[String,String]] = CSVDictReader(file.getInputStream)
val parsedProducts = for {
row <- rows
name <- row.get("NAME")
id <- row.get("ID")
} yield Product(name, id)
这里,如果row.get(“NAME”)或row.get(“ID”)返回None,则不会产生相应的条目。
答案 2 :(得分:0)
我不确定这是否是您要找的,但以下代码段:
val rows: Iterator[Map[String,String]] = Iterator(Map("NAME" -> " ", "ID" -> "foo"), Map("NAME" -> " ", "ID" -> ""))
val fieldNames = List("NAME","ID","ANOTHER COLUMN")
val cleanedRows = rows map { row =>
fieldNames map { fieldName =>
Map ( fieldName -> row.get(fieldName).filter (_.trim.nonEmpty) )
}
}
while(cleanedRows.hasNext) {
println(cleanedRows.next)
}
打印出来:
List(Map(NAME -> None), Map(ID -> Some(foo)), Map(ANOTHER COLUMN -> None))
List(Map(NAME -> None), Map(ID -> None), Map(ANOTHER COLUMN -> None))
因此,此时cleanedRows
将包含您创建Product
个实例所需的条目。