Как определить пустой кортеж? - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть следующее определение функции:

  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

        }

      }

вопрос в том, есть ли другой способ определения пустого Tuple вместо ("", "")?

Ответы [ 2 ]

5 голосов
/ 20 сентября 2019

Пустой кортеж

("", "") - это кортеж пустых строк типа (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))
1 голос
/ 20 сентября 2019

Я не думаю, что можно определить пустой кортеж.

Я пытался использовать (->), но это разрешает Tuple2.type, а не Tuple2.

* 1007.* Если значения вашего кортежа являются необязательными, используйте систему типов, чтобы выразить это:
(Option[String], Option[String])

Еще лучше, вы можете определить класс наблюдений для вашей структуры данных:
case class HostAndPort(host: Option[String], port: Option[String])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...