【问题标题】:How to eliminate val repetition in this Scala assign/test/throw sequence如何在这个 Scala 分配/测试/抛出序列中消除 val 重复
【发布时间】:2023-04-06 03:27:01
【问题描述】:

当 properties.keySet 包含 EXPECTED_IMPORT_KEYS 中不存在的键时,此代码会引发异常。 val在代码中被引用了3次,

val unexpectedKeys = properties.keySet -- EXPECTED_IMPORT_KEYS
if (unexpectedKeys.nonEmpty) {
   throw new UnexpectedKeysException(unexpectedKeys)
}

在 Scala 中是否有更优雅的方式来实现这一点?我特别想到了重复的 val 引用。这些重复可以消除吗?

知道在代码完成后不需要 unexpectedKeys val 可能会有所帮助。

我正在寻找的改进是将 val 发生的次数从 3 次减少到 3 次。没有必要有一个 val,这只是我最初的表述。

【问题讨论】:

    标签: scala boilerplate


    【解决方案1】:

    如果你经常需要这个,只需定义一个小辅助方法:

    def emptyOption[A, CC <: Iterable[A]](coll: B with collection.IterableLike[A, CC]) =
      if (coll.isEmpty) None else Some(coll)
    

    然后像这样使用它:

    scala> emptyOption(Set[Int]()) foreach (coll => throw new RuntimeException(coll.toString))
    
    scala> emptyOption(Set[Int](1)) foreach (coll => throw new RuntimeException(coll.toString))
    java.lang.RuntimeException: Set(1)
    

    【讨论】:

      【解决方案2】:

      你可以试试:

      (properties.keySet -- EXPECTED_IMPORT_KEY) match {
        case residual if residual.nonEmpty => throw new UnexpectedKeysException(residual)
        case _ =>
      }
      

      【讨论】:

      • "match" 确实发生在我身上,但我无法改进此处提供的示例,其中提到了 3 次残差。
      • 一次命名,一次检查是否为空,一次扔掉......我怀疑你会做得更好。
      • 我想说改进至少是没有不必要的 val (unexpectedKeys) defined 。值 residual 仅在匹配范围内定义。
      猜你喜欢
      • 2014-08-07
      • 2017-12-26
      • 2018-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      相关资源
      最近更新 更多