假设我有Seq [(String,Any)]
(Foo,1 )
(bar,2)
(baz,)
我希望过滤掉baz,因为它没有值我怎样才能检查和删除(baz,)
答案 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
周围的内在否定,但改为使用forall
和filterNot
。
这是两个答案之间的合并,我不知道该怎么处理?我应该将其移到单独的社区维基答案中吗? (暂时提出另一个答案,重新平衡一点)