Пустой кортеж
("", "")
- это кортеж пустых строк типа (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
}
}
}
доходность
Your approach
(localhost,4000)
(localhostb,)
New approach
HostPort(localhost,Some(4000))