前言:
关于Scala的类型转换方式有许多种,但初学时仍会忽略一些重要细节,比如异常情况的捕获等等。
那么本文将简单介绍Scala的String进行相关的类型转换,供大家学习参考。
主要内容:
1、Scala的富包装器:富操作和富类列表
2、Scala的隐式转换的目的
通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,
忽略那些冗长,过于细节的代码。
3、classOf、isInstanceOf、asInstanceOf区别
(1)classOf[T]: 获取类型T的Class对象
(2)isInstanceOf[T]: 判断对象是否为T类型的实例。
(3)asInstanceOf[T]: 强制类型转换
4、类型转换方式
代码举例如下:
package com.ngaa.bigdata.scala.test
import org.scalatest.FunSuite
/**
* Created by yangjf on 20171018.
* Update date:
* Time: 11:47
* Project: sparkmvn
* Package: com.ngaa.bigdata.scala.test
* Describe : Test cast String to other type.
*
* Status:Using online
*
* Please note:
* Must be checked once every time you submit a configuration file is correct!
* Data is priceless! Accidentally deleted the consequences!
*
*/
class TestCastString extends FunSuite{
/**
* 第一种类型转换方式
*
* @param s string
* @return 转换后的类
*/
def parseDouble(s: String): Option[Double] = try { Some(s.toDouble) } catch { case _ => None }
/**
* 第二种类型转换方式
*
* @param s string
* @tparam T class type
* @return option
*/
def parse[T: ParseOp](s: String): Option[T] = try { Some(implicitly[ParseOp[T]].op(s)) } catch {case _ => None}
/* 隐式转换类型类*/
case class ParseOp[T](op: String => T)
implicit val popDouble = ParseOp[Double](_.toDouble)
implicit val popInt = ParseOp[Int](_.toInt)
implicit val popLong = ParseOp[Long](_.toLong)
implicit val popFloat = ParseOp[Float](_.toFloat)
// https://stackoverflow.com/questions/9542126/how-to-find-if-a-scala-string-is-parseable-as-a-double-or-not
test("to double"){
val dd02="0.234"
println(dd02.isInstanceOf[String]) // 判断是否为String类型
parseDouble(dd02) match { //正确的方式
case Some(t)=>println(t)
case None=>println(None)
}
println(parse[Double](dd02)) // 正确的转换方式
println(dd02.asInstanceOf[Double]) // 错误的转换方式:强制类型转换:java.lang.String cannot be cast to java.lang.Double
println(dd02.toFloat) // 错误的转换方式,会抛出异常: java.lang.String cannot be cast to java.lang.Double
}
/**
* +++++++++++++++++++++ 运行打印结果如下 +++++++++++++++++++++
*
* Testing started at 14:19 ...
* true
* 0.234
* Some(0.234)
*
* java.lang.String cannot be cast to java.lang.Double
* java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Double
* at scala.runtime.BoxesRunTime.unboxToDouble(BoxesRunTime.java:119)
* at com.ngaa.bigdata.scala.test.TestCastString$$anonfun$1.apply$mcV$sp(TestCastString.scala:57)
* at com.ngaa.bigdata.scala.test.TestCastString$$anonfun$1.apply(TestCastString.scala:48)
* at com.ngaa.bigdata.scala.test.TestCastString$$anonfun$1.apply(TestCastString.scala:48)
* at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)
* at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
* at org.scalatest.Transformer.apply(Transformer.scala:22)
* at org.scalatest.Transformer.apply(Transformer.scala:20)
* at org.scalatest.FunSuiteLike$$anon$1.apply(FunSuiteLike.scala:186)
* at org.scalatest.TestSuite$class.withFixture(TestSuite.scala:196)
* at org.scalatest.FunSuite.withFixture(FunSuite.scala:1560)
* at org.scalatest.FunSuiteLike$class.invokeWithFixture$1(FunSuiteLike.scala:183)
* at org.scalatest.FunSuiteLike$$anonfun$runTest$1.apply(FunSuiteLike.scala:196)
* at org.scalatest.FunSuiteLike$$anonfun$runTest$1.apply(FunSuiteLike.scala:196)
* at org.scalatest.SuperEngine.runTestImpl(Engine.scala:289)
* at org.scalatest.FunSuiteLike$class.runTest(FunSuiteLike.scala:196)
* at org.scalatest.FunSuite.runTest(FunSuite.scala:1560)
* at org.scalatest.FunSuiteLike$$anonfun$runTests$1.apply(FunSuiteLike.scala:229)
* at org.scalatest.FunSuiteLike$$anonfun$runTests$1.apply(FunSuiteLike.scala:229)
* at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:396)
* at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:384)
* at scala.collection.immutable.List.foreach(List.scala:318)
* at org.scalatest.SuperEngine.traverseSubNodes$1(Engine.scala:384)
* at org.scalatest.SuperEngine.org$scalatest$SuperEngine$$runTestsInBranch(Engine.scala:379)
* at org.scalatest.SuperEngine.runTestsImpl(Engine.scala:461)
* at org.scalatest.FunSuiteLike$class.runTests(FunSuiteLike.scala:229)
* at org.scalatest.FunSuite.runTests(FunSuite.scala:1560)
* at org.scalatest.Suite$class.run(Suite.scala:1147)
* at org.scalatest.FunSuite.org$scalatest$FunSuiteLike$$super$run(FunSuite.scala:1560)
* at org.scalatest.FunSuiteLike$$anonfun$run$1.apply(FunSuiteLike.scala:233)
* at org.scalatest.FunSuiteLike$$anonfun$run$1.apply(FunSuiteLike.scala:233)
* at org.scalatest.SuperEngine.runImpl(Engine.scala:521)
* at org.scalatest.FunSuiteLike$class.run(FunSuiteLike.scala:233)
* at org.scalatest.FunSuite.run(FunSuite.scala:1560)
* at org.scalatest.tools.SuiteRunner.run(SuiteRunner.scala:45)
* at org.scalatest.tools.Runner$$anonfun$doRunRunRunDaDoRunRun$1.apply(Runner.scala:1340)
* at org.scalatest.tools.Runner$$anonfun$doRunRunRunDaDoRunRun$1.apply(Runner.scala:1334)
* at scala.collection.immutable.List.foreach(List.scala:318)
* at org.scalatest.tools.Runner$.doRunRunRunDaDoRunRun(Runner.scala:1334)
* at org.scalatest.tools.Runner$$anonfun$runOptionallyWithPassFailReporter$2.apply(Runner.scala:1011)
* at org.scalatest.tools.Runner$$anonfun$runOptionallyWithPassFailReporter$2.apply(Runner.scala:1010)
* at org.scalatest.tools.Runner$.withClassLoaderAndDispatchReporter(Runner.scala:1500)
* at org.scalatest.tools.Runner$.runOptionallyWithPassFailReporter(Runner.scala:1010)
* at org.scalatest.tools.Runner$.run(Runner.scala:850)
* at org.scalatest.tools.Runner.run(Runner.scala)
* at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.runScalaTest2(ScalaTestRunner.java:138)
* at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.main(ScalaTestRunner.java:28)
* at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
* at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
* at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
* at java.lang.reflect.Method.invoke(Method.java:606)
* at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
*
*
* Process finished with exit code 0
*
*/
}
参考:
2、富包装器:http://www.scala-lang.org/api/current/scala/runtime/
3、预定义方法分析: http://itang.iteye.com/blog/1128707