[Scala--基础]--->类型转换(String to Double 、Long、Float和Int)

来源:互联网 发布:java中16进制怎么表示 编辑:程序博客网 时间:2024/04/30 23:38

前言:

       关于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.testimport 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.  *  * Result of Test: test ok,test error  * Email:  jifei.yang@ngaa.com.cn  * 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    *     */}


参考:

    1、类型转换:https://stackoverflow.com/questions/9542126/how-to-find-if-a-scala-string-is-parseable-as-a-double-or-not

    2、富包装器:http://www.scala-lang.org/api/current/scala/runtime/

    3、预定义方法分析: http://itang.iteye.com/blog/1128707




阅读全文
0 0