Scala 迭代器中的过滤映射
我有以下代码:Scala 迭代器中的过滤映射,scala,Scala,我有以下代码: 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) 如果值为空字符串,如果不引入一些helpe
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)
如果值为空字符串,如果不引入一些helper函数来返回None,我就无法理解如何以一种好的方式来实现这一点
编辑:在我的示例中,我只有name和id,但在实际代码中,很容易有超过10列的数据。另外,我需要使用None来代替空字符串值。因此,name=Option(“”)应替换为name=None您也可以筛选
选项
假设您的x.get(“NAME”)
返回一个Some(“”
或甚至Some(“”
)
然后您可以这样做:x.get(“NAME”).filter(\uu.trim.nonEmpty)
希望我能正确理解你的问题像这样的问题
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)
val行:迭代器[Map[String,String]]=CSVDictReader(file.getInputStream)
val parsedProducts=for{
row我不确定这是否是您要查找的,但是下面的代码片段:
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
将具有创建产品
实例所需的条目。替换或删除?如果要替换它们,除了从map获得的空字符串外,还有什么替代方法?是的,这是可行的,但我希望避免为每个CSV字段复制.filter(u.trim.nonEmpty)。