我有以下函数定义:
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而不是("", "")?
("", "")是类型为的空字符串的元组(String, String)。在这种情况下,尚不清楚为空,可能为(None, None)甚至(null, null)(坏)
您似乎用来""表示不存在的值。尝试使用None和的Some [String]这两个子类型Option[String],以指示不存在值。
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)