以有效的方式从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 在这段代码中的点呢?你真的需要一张地图吗?如果您解释了您要达到的目标,那将会很有帮助。要删除任何Nones,您只需执行t.flatten,但大多数集合操作实际上会过滤掉None,所以如果您解释了您的目标,也许有更好的方法 @sinanspd 是的,我需要一张地图 @sinanspd flatten 返回Map[Nothing, Seq[Option[String]] flatten 不能单独在这里工作,因为它也会删除Some。您可以执行t.flatten.groupMap(x => x)(Some(_)) 之类的操作,也可以使用foldLeft 定义自己的累积逻辑 好吧,你刚刚完全改变了你的问题......原来的问题是如何摆脱isDefined.get。您提供的代码也没有摆脱空字符串。 Option("")不是无。空字符串仍然是有效值。你别无选择,只能显式过滤它 【参考方案1】:

由于需要同时filtermap,所以可以collect

t.collect  case Some(s) if s.nonEmpty => s .groupBy(identity)

这样的结果是

Map("abc" -> Seq("abc", "abc"), "def" -> List("def"))

您可以使用此代码here on Scastie。

你可以阅读更多关于collecthere on the official documentation的信息。

【讨论】:

知道了,我的实际用例似乎与我发布的不同,我将创建另一个线程 ***.com/questions/69898936/…

以上是关于以有效的方式从scala中的序列中过滤选项的主要内容,如果未能解决你的问题,请参考以下文章

如何使用惯用的Scala替换(填充)来自另一个列表的选项列表中的None条目?

如何从模型中获取唯一的选项列表以填充选择框

从搜索查询中获取唯一值以填充搜索过滤器选项

Select2 从过滤列表中选择所有选项以进行多项选择

从 UITabBarController 中的另一个选项卡以编程方式在 UIPageViewController 中翻页

Drupal 7 中暴露过滤器的删除或过滤选项