【问题标题】:For comprehension parsing of optional string to int用于将可选字符串理解解析为 int
【发布时间】:2019-06-20 15:01:00
【问题描述】:

假设我有以下理解:

val validatedInput = for {
    stringID <- parseToInt(optionalInputID)
} yield (stringID)

其中 optionalInputID 是 Option[String] 类型的输入参数。如果当然存在选项,我希望能够将 Option[String] 转换为字符串。据我所知,您不能在 for 理解中进行大小写匹配。

省略了一些细节,例如其他用于理解的项目。因此,我想知道是否可以在 for 理解中执行此操作。如果不是,那么什么是合适的替代方案?我可以在 for 理解之外做吗?

【问题讨论】:

    标签: string scala for-comprehension scala-option


    【解决方案1】:

    只需将其添加到for comprehension

    val validatedInput = for {
      inputID <- optionalInputID
      stringID <- parseToInt(inputID)
    } yield (stringID)
    

    仅当parseToInt 的类型为Option 时才有效。如果它返回 Try 的东西,你就不能这样做 - 因为你不能在同一个理解中混合 TryOption

    如果parseToInt 返回Try,您可以执行以下操作:

    val validatedInput = for {
      inputID <- optionalInputID
      stringID <- parseToInt(inputID).toOption
    } yield (stringID)
    

    【讨论】:

    • 我收到类型不匹配错误。这可能是因为存在 Some or None 的可能性吗?
    • 我更新了答案,parseToInt的返回类型是什么?
    • Expression of type Option[(ID, int, String)] doesn't conform to the expected type Either[A1_, B1_] IDint 是 for comprehension 中的其他语句(我想省略这个问题的细节)。
    • 我理解这是否完全没有帮助。我会尝试更新我的问题以适应我刚刚评论的这个错误。
    【解决方案2】:

    我希望能够将 Option[String] 转换为字符串。

    因此我想知道是否可以在 for 理解中执行此操作

    在 Scala 中,for-comprehension 脱糖为 mapflatMapfilter 的组合,它们都不允许从 Option 中提取值。

    如果不是,那么有什么合适的选择?我可以在 for 理解之外做吗?

    为此,您可以使用get(不安全)之一,或者更安全的版本getOrElse,或fold

    
    val validatedInput: Option[String] = Some("myString")
    
    scala>validatedInput.get
    // res1: String = "myString"
    
    scala>validatedInput.getOrElse("empty")
    // res2: String = "myString"
    
    scala>validatedInput.fold("empty")(identity)
    // res3: String = "myString"
    
    

    【讨论】:

    • 在我的声明中添加 getOrElse 似乎有效。 stringID &lt;- idFromString(inputID.getOrElse(""))。另外,我改变了我的说法。我不需要一个int。我需要一个身份证。但这似乎行得通。谢谢!
    猜你喜欢
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    相关资源
    最近更新 更多