以有效的方式从scala中的序列中过滤选项
Posted
技术标签:
【中文标题】以有效的方式从scala中的序列中过滤选项【英文标题】:Filter Option from a sequence in scala in effective way 【发布时间】:2021-12-22 01:47:29 【问题描述】:我想摆脱.isDefined
和.get
,有什么好的建议
val t = Seq(Option("abc"), Option("def"), Option("abc"), Option(""))
t.filter(_.isDefined).groupBy(x =>x.get)
我需要我的返回类型为Map[String, Seq[String]]
【问题讨论】:
如果groupBy
在这段代码中的点呢?你真的需要一张地图吗?如果您解释了您要达到的目标,那将会很有帮助。要删除任何None
s,您只需执行t.flatten
,但大多数集合操作实际上会过滤掉None
,所以如果您解释了您的目标,也许有更好的方法
@sinanspd 是的,我需要一张地图
@sinanspd flatten 返回Map[Nothing, Seq[Option[String]]
flatten
不能单独在这里工作,因为它也会删除Some
。您可以执行t.flatten.groupMap(x => x)(Some(_))
之类的操作,也可以使用foldLeft
定义自己的累积逻辑
好吧,你刚刚完全改变了你的问题......原来的问题是如何摆脱isDefined
和.get
。您提供的代码也没有摆脱空字符串。 Option("")
是不是无。空字符串仍然是有效值。你别无选择,只能显式过滤它
【参考方案1】:
由于需要同时filter
和map
,所以可以collect
:
t.collect case Some(s) if s.nonEmpty => s .groupBy(identity)
这样的结果是
Map("abc" -> Seq("abc", "abc"), "def" -> List("def"))
您可以使用此代码here on Scastie。
你可以阅读更多关于collect
here on the official documentation的信息。
【讨论】:
知道了,我的实际用例似乎与我发布的不同,我将创建另一个线程 ***.com/questions/69898936/…以上是关于以有效的方式从scala中的序列中过滤选项的主要内容,如果未能解决你的问题,请参考以下文章
如何使用惯用的Scala替换(填充)来自另一个列表的选项列表中的None条目?
从 UITabBarController 中的另一个选项卡以编程方式在 UIPageViewController 中翻页