集合中的可选元素取决于条件,在scala中不进行额外筛选

集合中的可选元素取决于条件,在scala中不进行额外筛选,scala,Scala,我正试图找到一种最好的方法,只将一个元素有条件地添加到集合中。让我试着解释一下 让我们: 你可以看到我使用的是colemak布局我打赌 我想制作一个贴图,但仅当元素的长度大于1时才包含元素 我可以去: Map("a" -> a, "b" ->b, "c"->c).filter(_._2.length>0) 这给了我想要的地图: res7: scala.collection.immutable.Map[java.lang.String,java.lang.String]

我正试图找到一种最好的方法,只将一个元素有条件地添加到集合中。让我试着解释一下

让我们:

你可以看到我使用的是colemak布局我打赌

我想制作一个贴图,但仅当元素的长度大于1时才包含元素

我可以去:

Map("a" -> a, "b" ->b, "c"->c).filter(_._2.length>0)
这给了我想要的地图:

res7: scala.collection.immutable.Map[java.lang.String,java.lang.String] = 
Map(a -> 1234, b -> 1arst)
我还可以做以下事情:

Map(
if(a.length>0) "a"->a else "" -> "" ,
if(b.length>0) "b"->b else "" -> "" , 
if(c.length>0) "c"->c else "" -> "" ) 
但这在映射中给了我一个不需要的空字符串值,我仍然需要对其进行过滤:

res12: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map(a -> 1234, b -> 1arst, "" -> "")
所以我想对Nil使用右关联运算符,但这也不起作用,因为列表中的列表项为空

scala>test->test::Nil::test->test::Nil res1: 列表[可序列化的产品]=列表测试,测试,列表, 试验,试验


是否有一种更有效的方法来完成此操作,而无需再次筛选所有元素以删除任何长度为0的项目?

有关类似的问题和一些答案,请参阅。您为什么不满意筛选?这是相当可读的,然后吨的条件内的地图。@非决定性的感谢。我也喜欢带“展平”的“有/无”解决方案。但这些解决方案需要两次浏览地图,这似乎是次优的。唉,过早的优化是万恶之母
res12: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map(a -> 1234, b -> 1arst, "" -> "")