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)。