【问题标题】:Extend / Replicate Scala collections syntax to create your own collection?扩展/复制 Scala 集合语法来创建您自己的集合?
【发布时间】:2022-11-21 14:28:58
【问题描述】:

我想构建一个地图,但是我想丢弃所有具有空值的键,如下所示:

@tailrec
  def safeFiltersMap(
                          map: Map[String, String],
                          accumulator: Map[String,String] = Map.empty): Map[String, String] = {
    if(map.isEmpty) return accumulator

    val curr = map.head
    val (key, value) = curr
    safeFiltersMap(
      map.tail,
      if(value.nonEmpty) accumulator + (key->value)
      else accumulator
    )
  }

现在这很好但是我需要像这样使用它:

val safeMap = safeFiltersMap(Map("a"->"b","c"->"d"))

而我想像实例化地图一样使用它:

val safeMap = safeFiltersMap("a"->"b","c"->"d")

我可以遵循什么语法来实现这一目标?

【问题讨论】:

    标签: scala


    【解决方案1】:

    -> 语法不是 Scala 中的特殊语法。它实际上只是一个构造二元组的fancy way。因此,您也可以编写自己的函数来接受 2 元组。您不需要定义新的 Map 类型。您只需要一个过滤现有功能的功能。

    def safeFiltersMap(args: (String, String)*): Map[String, String] =
      Map(args: _*).filter { (k, v) => v != "" }
    

    然后调用使用

    safeFiltersMap("a"->"b","c"->"d")
    

    【讨论】:

    • 您共享的语法是否仅限于 scala 3?因为我在 scala 2.13 中出现错误:无法解析重载方法过滤器。似乎是一些语法问题,这个有效:def safeFiltersMap(args: (String, String)*): Map[String, String] = Map(args: _*).filter { result => { val (_, value) = result value.nonEmpty } }
    猜你喜欢
    • 1970-01-01
    • 2016-07-08
    • 2014-11-15
    • 2011-03-04
    • 1970-01-01
    • 2011-05-17
    • 2012-10-03
    • 2012-08-27
    相关资源
    最近更新 更多