从Scala中的Seq [(String,Any)]中删除空元组

时间:2018-05-11 19:47:53

标签: scala

假设我有Seq [(String,Any)]

(Foo,1 ) 
(bar,2)
(baz,)

我希望过滤掉baz,因为它没有值我怎样才能检查和删除(baz,)

2 个答案:

答案 0 :(得分:3)

删除第二部分包含null或仅包含空格的字符串的元组:

someList.filter {
  case (_, s: String) => s.trim.nonEmpty
  case (_, x) => x != null
}

我认为这非常易读,但是,如果性能有问题,您可以将s.trim.nonEmpty替换为s.exists(!Character.isWhitespace(_))

答案 1 :(得分:1)

这样的事可能吗?

seq.filterNot { case (_, y) => (
    y.isInstanceOf[String] && 
    y.asInstanceOf[String].forall(_.isWhitespace)
  ) || y == null
}

在一个小微基准测试我自己和@BrianMcCutchon的中间解决方案提案后,我得出结论

seq.filterNot { 
  case (_, s: String) => s.forall(_.isWhitespace)
  case (_, n) => n == null
}

既是最短的解决方案之一,也是最快的解决方案之一。这基本上是@BrianMcCutchon的模式匹配与isWhitespace相结合,并通过De-Morgan定律进行转换(避免isWhitespace周围的内在否定,但改为使用forallfilterNot

这是两个答案之间的合并,我不知道该怎么处理?我应该将其移到单独的社区维基答案中吗? (暂时提出另一个答案,重新平衡一点)