如何定义一个空的元组?

zer*_*ing 0 scala

我有以下函数定义:

  private def extractUrl: String => (String, String)
  = url =>
    url
      .split("/")
      .toList
      .filter(_.startsWith("localhost"))
      .flatMap(e => e.split(":").toList)
      .foldLeft[(String, String)](("", "")) { (acc, x) =>
        acc match {
          case ("", "") => (x, "")
          case (a, "") => (a, x)
          case z => z

        }

      }
Run Code Online (Sandbox Code Playgroud)

问题是,还有另一种方法来定义空Tuple而不是("", "")

Mar*_*nne 5

空元组

("", "")是类型为的空字符串的元组(String, String)。在这种情况下,尚不清楚为空,可能为(None, None)甚至(null, null)(坏)

您似乎用来""表示不存在的值。尝试使用None和的Some [String]这两个子类型Option[String],以指示不存在值。

分析与评论

  • 潜在地,您的方法似乎没有达到预期的目的。(执行下面的代码)
  • 考虑使用已经存在的函数/方法/库来处理URL(另请参见下面的示例)
  • 考虑使用Option
object Fun {

  import java.net.URL

  def main(args: Array[String]): Unit = {
    val url1 = "http://localhost:4000/a/b/c?x=1&y=2#asdf"
    val url2 = "http://example.com:4000/a/localhostb/c?x=1&y=2#asdf"
    val urls = List(url1, url2)

    // your approach
    println("Your approach")
    urls.map( urlString => extractUrl(urlString ))
      .foreach(println)

    println("New approach")
    urls.map(x => extractUrl2(x))
      .filter( x => x.host.startsWith("localhost") )
      .foreach(println)
  }

  case class HostPort(host: String, port: Option[String])

  def extractUrl2: String => HostPort = urlString => {
    val url = new URL(urlString)
    HostPort(url.getHost,
     url.getPort match {
       case -1 => None
       case i => Some(i.toString)
    })
  }


  def extractUrl: String => (String, String) = url =>
    url
      .split("/")
      .toList
      .filter(_.startsWith("localhost"))
      .flatMap(e => e.split(":").toList)
      .foldLeft[(String, String)](("", "")) { (acc, x) =>
        acc match {
          case ("", "") => (x, "")
          case (a, "") => (a, x)
          case z => z

        }
      }
}
Run Code Online (Sandbox Code Playgroud)

产量

Your approach
(localhost,4000)
(localhostb,)
New approach
HostPort(localhost,Some(4000))
Run Code Online (Sandbox Code Playgroud)