【Scala】Scala之Numbers(一)

简介:  前面已经学习了Scala中的String,接着学习Scala的Numbers。

一、前言

  前面已经学习了Scala中的String,接着学习Scala的Numbers。


二、Numbers


  在Scala中,所有的数字类型,如Byte,Char,Double,Float,Int,Long,Short都是对象,这七种数字类型继承AnyVal特质,这七种数字类型与其在Java中有相同的范围,而Unit和Boolean则被认为是非数字值类型,Boolean有false和true两个值,你可以获取到各个数字类型的最值。

  1.png

  复杂的数字和日期

  如果需要更强大的数类,可以使用spirescalalab

  如果需要更强大的日期类,可以使用Joda Timenscala-time

  

2.1 从字符串中解析数字

  

1. 问题

  你想要将字符串类型转化为数字类型。

 

 2. 解决方案

  使用String的to*方法即可将String转化为相应的数字。

  2.png

  当无法进行转化时,to*方法可能会抛出NumberFormatException异常。

  3.png

  可以直接使用字符串来创建BigInt和BigDecimal实例(也可能会抛出异常)

  4.png

  处理基和基数

  如果在计算时不以10为基(十进制)进行计算,而要使用其他进制,此时Int类的toInt方法不允许传入基和基数,此时需要使用parseInt方法,parseInt可将字符串转化为在指定进制下的值

  5.png

  也可以使用隐式转化来完成上述的功能

  6.png

  

3. 讨论

  由于在Scala中没有受检查异常,因此你不需要在方法中声明throws NumberFormatException。但是为了使调用者明白该方法可能会抛出异常,你可以使用throws注解 

@throws(classOf[NumberFormatException])
def toInt(s: String) = s.toInt

更通常而言,在Scala中使用Option/None/Some进行模式匹配来处理 

def toInt(s: String):Option[Int] = {
    try {
        Some(s.toInt)
    } catch {
        case e: NumberFormatException => None
    }
}      

 此时你就可以使用不同的方法来调用toInt方法  

println(toInt("1").getOrElse(0)) // 1
println(toInt("a").getOrElse(0)) // 0

另外一种使用方法就是使用匹配表达式 

toInt(aString) match {
    case Some(n) => println(n)
    case None => println("Boom! That wasn't a number.")
}

 也可以使用如下直接提取出值 

val result = toInt(aString) match {
    case Some(x) => x
    case None => 0 
}


2.2 数字类型间的转化

  

1. 问题描述

  

你想要从一种数字类型转化为另一种数字类型,如从Int到Double。

  

2. 解决方案

  不同于Java使用cast方法,Scala中可以直接使用数字类型提供的to*方法。

  1.png

  

3. 讨论

  在Java中,需要强制转化来将double类型转化为int类型 

int a = (int) 100.00;


  但是在Scala中,使用to*方法即可完成上述转化,如果你想要避免转化错误,你可以使用isValid方法来测试是否可以转化

  2.png

  

2.3 重写默认类型

  

1. 问题描述

  当你给变量赋值时,Scala会自动给变量赋予相应的类型,当你创建数字字段时,你需要重写默认的类型。

  

2. 解决方案

  如果你将1赋值给变量a,那么a默认为Int类型

  3.png

  下面例子重写了默认类型

  4.png

  另一种方法是用类型注释变量

  5.png

  也可以在等号左边进行定义

  6.png

  你也可以在数字前面添加0x或0X来创建十六进制整形

  7.png

  

3. 讨论

  当创建对象实例时,应该注意如下语法结构

var [name]:[Type] = [initial value]

 在初始化数字类型的var字段时,可以使用占位符,其值默认为0,占位符仅仅只在类定义时有效,其他时候则不行,如在方法内部定义不起作用

class Foo {
    var a: Short = 0 // 定义初始值
    var b: Short = _ // 默认为0
}

 但在方法中,可以使用如下方法  

var name = null.asInstanceOf[String]

 当然更好的办法是使用Option/None/Some模式匹配,这样可以避免空值


目录
相关文章
|
Java Scala
【Scala】Scala之Numbers(二)
 前面已经学习了Scala中的String,接着学习Scala的Numbers。
191 0
【Scala】Scala之Numbers(二)
|
1月前
|
分布式计算 大数据 Java
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
49 5
|
1月前
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
49 3
|
1月前
|
消息中间件 分布式计算 NoSQL
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
40 0
|
1月前
|
消息中间件 存储 分布式计算
大数据-103 Spark Streaming Kafka Offset管理详解 Scala自定义Offset
大数据-103 Spark Streaming Kafka Offset管理详解 Scala自定义Offset
82 0
|
1月前
|
分布式计算 大数据 Java
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
24 1
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
|
1月前
|
SQL 分布式计算 Java
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
34 0
|
1月前
|
缓存 分布式计算 大数据
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(一)
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(一)
45 0
|
1月前
|
分布式计算 算法 大数据
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(二)
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(二)
50 0
|
5月前
|
分布式计算 资源调度 Java
Scala+Spark+Hadoop+IDEA实现WordCount单词计数,上传并执行任务(简单实例-下)
Scala+Spark+Hadoop+IDEA实现WordCount单词计数,上传并执行任务(简单实例-下)
58 0