Если вы имеете в виду, как бы вы конвертировали val s = "Hello 69 13.5%"
в (String, Int, Double)
, то самый очевидный способ -
val tokens = s.split(" ")
(tokens(0).toString,
tokens(1).toInt,
tokens(2).init.toDouble / 100)
// (java.lang.String, Int, Double) = (Hello,69,0.135)
Или, как уже упоминалось, вы можете сопоставить с помощью регулярного выражения:
val R = """(.*) (\d+) (\d*\.?\d*)%""".r
s match {
case R(str, int, dbl) => (str, int.toInt, dbl.toDouble / 100)
}
Если вы на самом деле не знаете, какие данные будут в строке, тогда, вероятно, нет особых оснований для преобразования их из строки в тип, который он представляет, поскольку как вы можете использовать что-то, что String
а может быть в Int
? Тем не менее, вы можете сделать что-то вроде этого:
val int = """(\d+)""".r
val pct = """(\d*\.?\d*)%""".r
val res = s.split(" ").map {
case int(x) => x.toInt
case pct(x) => x.toDouble / 100
case str => str
} // Array[Any] = Array(Hello, 69, 0.135)
Теперь, чтобы сделать что-нибудь полезное, вам нужно сопоставить свои значения по типу:
res.map {
case x: Int => println("It's an Int!")
case x: Double => println("It's a Double!")
case x: String => println("It's a String!")
case _ => println("It's a Fail!")
}
Или, если вы хотите пойти немного дальше, вы можете определить некоторые экстракторы, которые сделают преобразование для вас:
abstract class StringExtractor[A] {
def conversion(s: String): A
def unapply(s: String): Option[A] = try { Some(conversion(s)) }
catch { case _ => None }
}
val intEx = new StringExtractor[Int] {
def conversion(s: String) = s.toInt
}
val pctEx = new StringExtractor[Double] {
val pct = """(\d*\.?\d*)%""".r
def conversion(s: String) = s match { case pct(x) => x.toDouble / 100 }
}
и использование:
"Hello 69 13.5%".split(" ").map {
case intEx(x) => println(x + " is Int: " + x.isInstanceOf[Int])
case pctEx(x) => println(x + " is Double: " + x.isInstanceOf[Double])
case str => println(str)
}
печать
Hello
69 is Int: true
0.135 is Double: true
Конечно, вы можете сделать так, чтобы экстракторы соответствовали всем, что вы хотите (мнемоника валюты, переименование с помощью 'J', URL) и возвращать любой тип, который вы хотите. Вы также не ограничены соответствующими строками, если вместо StringExtractor[A]
вы сделаете это Extractor[A, B]
.