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

前言:

       关于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
    * 
    */
}

 

参考:

    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

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

往事随风ing

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值