在迭代器中过滤地图

时间:2014-03-04 11:48:32

标签: 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)

如果没有引入一些辅助函数来返回None,我无法理解如何以一种很好的方式执行此操作,以防值为空字符串。

编辑:在我的示例中,我只有名称和ID,但在实际代码中,有十几列数据。另外,我需要使用None而不是空字符串值。所以name = Option(“”)应替换为name = None

3 个答案:

答案 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个实例所需的条目。