[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
- [Scala--基础]--->类型转换(String to Double 、Long、Float和Int)
- C++ String 转换为 int、long、float、double类型
- Int,long,float,double类型
- java中String,int,Integer,char,Long,Float,Double,Date 类型转换
- String数据类型转换成long、int、double、float、boolean、char等七种数据类型
- String与int、long、float、double等相互转换
- java类型转换 Integer String Long Float Double Date
- java类型转换 Integer String Long Float Double Date
- java类型转换 Integer String Long Float Double Date
- C++中将string类型转换为int, float, double类型
- C++中将string类型转换为int, float, double类型
- C++中将string类型转换为int, float, double类型
- C++中将string类型转换为int, float, double类型
- string类型转换为int, float, double类型、随机数生成
- String与int float double 类型之间的转换
- C++中将string类型转换为int, float, double
- C++中int、double、float。string等常见类型转换
- Java int string double float之间类型转换
- 2.Player
- C/C++单元测试/集成测试自动化工具:winams、caseplay2
- 正确使用Android性能分析工具——TraceView
- shell 常用命令
- MySQL数据表range分区例子,按年/按月
- [Scala--基础]--->类型转换(String to Double 、Long、Float和Int)
- webView读取本地文件的相关设置代码
- PHP写一个二分法查找一个值在数组中的位置
- 大型网站架构之分布式消息队列
- 程序员时间管理法(基于 SGTD)
- 队列简单实现
- Docker 集群环境实现的新方式
- 爬虫技术(01)神箭手爬虫初学案例解读
- IFE-TASK10(任务十:Flexbox 布局练习)