Scala基础简介及代码示例

一、主要内容

Scala中变量的声明与函数定义
Scala中的控制结构
Scala中的数据类型

1:变量声明与函数定义

变量声明:val 和 var ,两者的区别是val声明的变量是不可变的,而var声明的变量可变

带返回值

scala> def max(x:Int,y:Int):Int = {
   |   if(x>y) x
   |   else  y
   | }
max: (x: Int, y: Int)Int
scala> max(1,2)
res5: Int = 2 

不带返回值

scala> def helloworld()=println("HelloWorld")
helloworld: ()Unit 

2:控制结构

1) 判断(if)

类似于上边函数定义中的max函数

2) 循环(while/do)

while 语句包括状态判断和循环体,只要当前状态判断为真,就执行循环体一遍,然后进行下一状态判断,判断为假时终止判断,形如 while (A)B

do语句和while相反,先执行循环体一遍,然后进行状态判断,状态判断为真,则继续执行循环体,否则终止循环,形如 do B while(A)

scala> var m =3
m: Int = 3 

scala> while(m!=0){
   |  println(m)
   |  m -= 1
   | }
3
2
1 

scala> var n =3
n: Int = 3 

scala> do{
   |  println(n)
   |  n -= 1
   | }while(n!=0)
3
2
1 

3) 枚举(for)

for的两种实现

scala> for(i<- 1 to 3)
   |   println(i)
1
2
3 

scala> for(i<- 1 until 3)
   |   println(i)
1
2 

4) 匹配(match表达式)

scala中的match类似于其他语言中的switch,从上往下进行匹配

scala> val a = "gyt"
a: String = gyt 

scala> a match{
   |  case "gyt" => println("OK")
   |  case "cyan" => println("no")
   | }
OK 

5) 异常处理(throw/try)

Scala通过throw抛出一个异常,其异常捕获和处理与java十分类似

scala> if(true){
   |  println("throw new exception")
   |  throw new IllegalArgumentException
   | }
throw new exception
java.lang.IllegalArgumentException
 ... 35 elided 
scala> try{
   | val file = new FileReader("input.txt")
   | }catch{
   | case ex: FileNotFoundException => //handle missing file
   | case ex: IOException => //handle other I/O error
   | }finally{
   | println("end")
   | }
end 

6) 输出(print/println)

一个不换行输出,一个换行输出

7) 输入(readline)

输入通常使用read函数,readline是从控制台输如一行,指定类型为readT,T为类型,例如

readscala> val name = readLine(“Your Name: \n”)
warning: there was one deprecation warning; re-run with -deprecation for details
Your Name:
name: String = thinkgamer

8) 其他语句

return语言表示返回某个值,但是Scala事实上无需使用return语句,对于函数来说,其默认返回值是最后出现的一个值,不用特别注明,如需要返回的值,并非最后出现时,可在函数体后加上该值的标识符使之出现,声明函数时使用return语句,必须声明返回值类型,例如 def max:T = {return}

break/continue在C++中非常常见的控制结构语句,但在Scala中是不必要的,可以使用布尔值类型的两通过if语句进行控制

3:数据结构

1) 数组

使用new来实例化一个类,当你创建一个对象的实例时,你可以使用数值或者类型参数

scala> val abc = new Array[String](3)
abc: Array[String] = Array(null, null, null)
scala> abc(0)="thinkgamer"
scala> abc(1)="cyan"
scala> abc(2)="GQ"
scala> for(i<- 0 to 2)
   |  println(abc(i))
thinkgamer
cyan
GQ 

这里也说明下为什么Scala使用()来访问数组元素,在Scala中,数组和其他普遍的类的定义一样,没有什么特别之处,当你某个值后面使用()时,Scala将其翻译成对应对象的apply方法,因此本例中abc(0)其实调用abc.apply(0)方法,这种表达方法不仅仅只限于数据,对于任何对象,如果在其后面使用(),都将调用该对象的apply方法,同一,日过对某个使用()的对象复制,比如
abc(0)=”thinkgamer”

scala将这种复制转换为该对象的update方法,也就是abc.update(0,”thinkgamer”),因此上边的例子也可以使用传统的方法调用,可以写成:

scala> val new_abc = new Array[String](3)
new_abc: Array[String] = Array(null, null, null)
scala> new_abc.update(0,"aaa")
scala> new_abc.update(1,"bbb")
scala> new_abc.update(2,"ccc")
scala> for(i<- 0 to 2)
   |  println(new_abc(i))
aaa
bbb
ccc 

从这点来收,数组在scala中并不是某种特殊的数据类型,和普通的类并没有什么区别

不过scala还是提供了初始化数组的简单的方法,上述的例子可以这样写:

scala> val abc = Array("thinkgamer","cyan","GQ")
abc: Array[String] = Array(thinkgamer, cyan, GQ) 

数组的输出可以采用while或者foreach或者for进行输出
scala> val abc = Array("thinkgamer","cyan","GQ")
abc: Array[String] = Array(thinkgamer, cyan, GQ)
scala> var i = 0
i: Int = 0
scala> while(i<abc.length){
   |  println(abc(i))
   |  i+=1
   | }
thinkgamer
cyan
GQ
scala> abc.foreach(str=>println(str))
thinkgamer
cyan
GQ 

2):Lists

Scala的List和Java不同,不能被改变,这样做的一个好处是方法与方法之间关联性较小,从而方法变得更可靠和重用性高,使用这个规则也就意味着变量的设置是不可修改的,这也就避免了多线程访问的互锁问题

scala> val one = List(1,2,3)
one: List[Int] = List(1, 2, 3)
scala> val two = List(4,5)
two: List[Int] = List(4, 5)
scala> val three = one:::two
three: List[Int] = List(1, 2, 3, 4, 5) 

:::方法表示连接两个列表,当然列表定义了::方法(右操作符),用于向列表添加元素

scala> val four = three::6::7::Nil
four: List[Any] = List(List(1, 2, 3, 4, 5), 6, 7) 

scala> val five = 1::2::3::4::Nil
five: List[Int] = List(1, 2, 3, 4) 

Nil表示空列表

Scala的List类还定义了其他很多很有用的方法,比如head,last,length,reverse,tail等这里就不一一说明了,具体可以参考List的文档

3) Tuples

Scala中另外一个很有用的容器类是Tupels,和Lists不同的Tuples可以包含不同类型的数据,而List只能包含同类型的数据,Tuples在方法需要返回多个结果时非常有用(Tuple对应数学的矢量的概念)

一旦定义了一个元组,可以使用._和索引来访问元组的元素(矢量的分量,注意和数组不同的是,元组的索引从1开始)

scala> val pair = (22,"one")
pair: (Int, String) = (22,one)
scala> println(pair._1)
22
scala> println(pair._2)
one 

元组的实际类型取决于它的分量的类型,比如上边的pair的类型实际为Tuple2[Int,String],目前Scala支持的元组的最大长度为22,如果有需要,你可以扩展更长的元组

4) Set

scala> var set = Set("a","b")
set: scala.collection.immutable.Set[String] = Set(a, b)
scala> set+="c"
scala> set
res8: scala.collection.immutable.Set[String] = Set(a, b, c)
scala> println(set.contains("c"))
true 

缺省情况Set为Immutable Set,如果你需要使用可修改的集合类(Set类型),你可以使用全路径来指明Set,比如scala.collection.mutalbe.Set

5) Map

Map的基本用法如下(Map类似于其他语言中的关联数据如PHP)

scala> val roman =Map(1->"I",2->"II")
roman: scala.collection.immutable.Map[Int,String] = Map(1 -> I, 2 -> II)
scala> println(roman(1))
I
scala> println(roman(2))
II 

总结

以上就是本文关于Scala基础简介及代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续浏览本站其他相关专题,有什么问题可以随时留言,小编会及时回复大家。感谢朋友们对本站的支持!

(0)

相关推荐

  • 浅谈Scala的Class、Object和Apply()方法

    Scala中如果一个Class和一个Object同名,则称Class是Object的伴生类.Scala没有Java的Static修饰符,Object下的成员和方法都是静态的,类似于Java里面加了Static修饰符的成员和方法.Class和Object都可以定义自己的Apply()方法,类名()调用Object下的Apply()方法,变量名()调用Class下的Apply()方法. class ApplyTest{ def apply() { println("This is a class,

  • Windows7下安装Scala 2.9.2教程

    1. 下载Scala 2.9.2 由于最新的Scala 2.10稳定版还没完成,所以最好是下载最新的Scala稳定版:2.9.2版. 下载地址:http://www.scala-lang.org/downloads/distrib/files/scala-2.9.2.msi 下载msi版本的好处在于,环境变量自动配置,否则你需要手动设置两个环境变量. SCALA_HOME环境变量,指向Scala的安装目录. PATH环境变量,要包含 %SCALA_HOME%\bin的值. 2. 安装Scala

  • Scala小程序详解及实例代码

    Scala小程序详解 1. 交互式模式 在命令行窗口中,输入Scala命令: xiaosi@Qunar:~$ scala Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_91). Type in expressions for evaluation. Or try :help. scala> 第一个小程序: xiaosi@Qunar:~$ scala Welcome to Scala 2.11.8 (

  • play for scala 实现SessionFilter 过滤未登录用户跳转到登录页面

    一.编写SessionFilter.scala代码 package filters import javax.inject.{Inject, Singleton} import akka.stream.Materializer import controllers.routes import play.api.mvc.{Filter, RequestHeader, Result, Results} import scala.concurrent.Future @Singleton class S

  • ExecuteReader(),ExecuteNonQuery(),ExecuteScalar(),ExecuteXmlReader()之间的区别

    ExecuteReader(),ExecuteNonQuery(),ExecuteScalar(),ExecuteXmlReader()之间的区别      主要有这么几种,cmd.ExecuteReader();cmd.ExecuteNonQuery();cmd.ExecuteScalar();cmd.ExecuteXmlReader();) 1,ExecuteReader();返回一个SqlDataReader对象或OleDbDataReader对象,这个看你的程序的需要去 做.可以通过这个

  • Scala基础简介及代码示例

    一.主要内容 Scala中变量的声明与函数定义 Scala中的控制结构 Scala中的数据类型 1:变量声明与函数定义 变量声明:val 和 var ,两者的区别是val声明的变量是不可变的,而var声明的变量可变 带返回值 scala> def max(x:Int,y:Int):Int = { | if(x>y) x | else y | } max: (x: Int, y: Int)Int scala> max(1,2) res5: Int = 2 不带返回值 scala> d

  • UEFI开发基础HII代码示例

    目录 代码示例 模块 formset form subtitle oneof string numeric text checkbox goto label 代码示例 代码 https://gitee.com/jiangwei0512/edk2-beni 模块 BeniPkg\DynamicCommand\SetupDynamicCommand\SetupDynamicCommand.inf. 这里通过一个命令setup来打开图形界面.图形界面的form在Page.vfr中,还有若干的uni文件

  • Spark的广播变量和累加器使用方法代码示例

    一.广播变量和累加器 通常情况下,当向Spark操作(如map,reduce)传递一个函数时,它会在一个远程集群节点上执行,它会使用函数中所有变量的副本.这些变量被复制到所有的机器上,远程机器上并没有被更新的变量会向驱动程序回传.在任务之间使用通用的,支持读写的共享变量是低效的.尽管如此,Spark提供了两种有限类型的共享变量,广播变量和累加器. 1.1 广播变量: 广播变量允许程序员将一个只读的变量缓存在每台机器上,而不用在任务之间传递变量.广播变量可被用于有效地给每个节点一个大输入数据集的副

  • 集合框架(Collections Framework)详解及代码示例

    简介 集合和数组的区别: 数组存储基础数据类型,且每一个数组都只能存储一种数据类型的数据,空间不可变. 集合存储对象,一个集合中可以存储多种类型的对象.空间可变. 严格地说,集合是存储对象的引用,每个对象都称为集合的元素.根据存储时数据结构的不同,分为几类集合.但对象不管存储到什么类型的集合中,既然集合能存储任何类型的对象,这些对象在存储时都必须向上转型为Object类型,也就是说,集合中的元素都是Object类型的对象. 既然是集合,无论分为几类,它都有集合的共性,也就是说虽然存储时数据结构不

  • python开发App基础操作API使用示例过程

    目录 手机控件查看工具uiautomatorviewer 工具简介 如何使用 APP元素定位操作 通过id定位 通过class定位 通过xpath定位 WebDriverWait 显示等待操作 发送数据到输入框 清空输入框内容: 获取元素的属性值 获取元素在屏幕上的坐标 获取app包名和启动名 APP元素事件操作API swip滑动事件 scroll滑动事件 drag拖拽事件 应用置于后台事件 APP模拟手势高级操作 手指轻敲操作 手指按操作 等待操作 手指长按操作 手指移动操作 手机控件查看工

  • Spark实现K-Means算法代码示例

    K-Means算法是一种基于距离的聚类算法,采用迭代的方法,计算出K个聚类中心,把若干个点聚成K类. MLlib实现K-Means算法的原理是,运行多个K-Means算法,每个称为run,返回最好的那个聚类的类簇中心.初始的类簇中心,可以是随机的,也可以是KMean||得来的,迭代达到一定的次数,或者所有run都收敛时,算法就结束. 用Spark实现K-Means算法,首先修改pom文件,引入机器学习MLlib包: <dependency> <groupId>org.apache.

  • ORACLE批量导入图片到BLOB字段代码示例

    要插入图片的表不是固定的,而且是批量插入很多张,还要考虑到因为图片的文件名错误,修改后要再次插入,此时应避免已经插入的重复执行操作, 浪费时间. 所以就选择先用一张临时表来暂时保存从文件系统读取的照片,用DBMS_LOB的方法来处理. 第一步:创建一个数据库可以访问的目录(注意:这个目录是数据库服务器上的目录,不是客户机上的) -- Create directory create or replace directory 图片目录 as 'E:\照片'; 第二步:将图片文件放入刚建好的目录下面,

  • Java编程redisson实现分布式锁代码示例

    最近由于工作很忙,很长时间没有更新博客了,今天为大家带来一篇有关Redisson实现分布式锁的文章,好了,不多说了,直接进入主题. 1. 可重入锁(Reentrant Lock) Redisson的分布式可重入锁RLock Java对象实现了java.util.concurrent.locks.Lock接口,同时还支持自动过期解锁. public void testReentrantLock(RedissonClient redisson){ RLock lock = redisson.getL

  • Java编程利用socket多线程访问服务器文件代码示例

    这篇文章将向大家展示Java编程利用socket多线程访问服务器文件代码示例,如果您想先了解Java多线程socket编程的基础知识,可以看下这篇文章:Java多线程编程实现socket通信示例代码. 接下来进入正文,我们看看利用socket多线程访问服务器代码: ServerMain.java package com.ysk.webServer; import java.io.File; import java.io.IOException; import java.net.ServerSoc

  • Java线程安全的计数器简单实现代码示例

    前几天工作中一段业务代码需要一个变量每天从1开始递增.为此自己简单的封装了一个线程安全的计数器,可以让一个变量每天从1开始递增.当然了,如果项目在运行中发生重启,即便日期还是当天,还是会从1开始重新计数.所以把计数器的值存储在数据库中会更靠谱,不过这不影响这段代码的价值,现在贴出来,供有需要的人参考. package com.hikvision.cms.rvs.common.util; import java.text.SimpleDateFormat; import java.util.Arr

随机推荐