gpt4 book ai didi

Scala:尝试 .getOrElse 与 if/else

转载 作者:行者123 更新时间:2023-12-01 23:22:29 25 4
gpt4 key购买 nike

我是一个相当新的 Scala 开发人员。我是一位经验丰富的 Java 开发人员,到目前为止,我一直喜欢 Scala 的简单性。我真的很喜欢函数式结构,而且它们经常会迫使您编写更清晰的代码。然而最近我注意到,由于舒适和简单,我最终使用了我不一定会在 Java 中使用的结构,实际上会被认为是一种不好的做法,例如

private def convertStringToSourceIds(value: String) : Seq[Integer] = {
Try(value.split(",").toSeq.map(convertToSourceId(_))).getOrElse(Seq())
}

同样的代码片段可以写成

private def convertStringToSourceIds(value: String) : Seq[Integer] = {
if(value!=null) value.split(",").toSeq.map(convertToSourceId(_)) else Seq()
}

我的一部分意识到 Try/getOrElse block 在设计时考虑了 Options 但通常它使代码更具可读性并处理您可能错过的情况(这当然并不总是一件好事)。

我很想知道经验丰富的 Scala 开发人员对此事的看法。

最佳答案

我并没有要求任何“经验”头衔,但出于某些原因我更喜欢您的第二个构造

  • 抛出异常(在本例中为 NPE)代价高昂,最好避免;它应该保持不变,exceptional

  • if 是 Scala 中的表达式,它避免声明“悬挂”变量来保存测试结果(就像三元运算符一样)。或者,match..case 结构提供非常易读的代码。

  • 我个人会返回一个 Option[Seq[Integer]] 来“传回”valuesnull 并促进函数的进一步链接。

有点像

private def convertStringToSourceIds(value: String) : Option[Seq[Integer]] = value match {
case null => None
case _ => Some(value.split(",").map(convertToSourceId(_)))
}

注意 1:不确定您是否需要 toSeq

注 2:无论好坏,看起来有点 Haskellish

Scala + FP 的组合几乎可以加倍确定你会得到不同的意见:)

编辑请阅读下面的评论以了解其他原因和替代方案,即

def convertStringToSourceIds(value: String): Option[Array[String]] = Option(value).map(_.split(",").map(convertToSourceId(_)))

关于Scala:尝试 .getOrElse 与 if/else,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34286745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com