永明商贸 發表於 2017-10-18 15:46:21

Scala基础简介及代码示例

<p><span style="font-size: medium"><strong>一、主要内容 </strong></span><br />
</p>
<p>Scala中变量的声明与函数定义 <br />
Scala中的控制结构 <br />
Scala中的数据类型</p>
<p><strong>1:变量声明与函数定义 </strong><br />
</p>
<p>变量声明:val 和 var ,两者的区别是val声明的变量是不可变的,而var声明的变量可变</p>
<p>带返回值</p>
<div class="jb51code">
<pre class="brush:scala;">
scala&gt; def max(x:Int,y:Int):Int = {
   |   if(x&gt;y) x
   |   elsey
   | }
max: (x: Int, y: Int)Int
scala&gt; max(1,2)
res5: Int = 2 </pre>
</div>
<p>不带返回值</p>
<div class="jb51code">
<pre class="brush:scala;">
scala&gt; def helloworld()=println("HelloWorld")
helloworld: ()Unit </pre>
</div>
<p><strong>2:控制结构 </strong><br />
</p>
<p><strong>1) 判断(if) <br />
</strong></p>
<p>类似于上边函数定义中的max函数 <br />
</p>
<p><strong>2) 循环(while/do) </strong><br />
</p>
<p>while 语句包括状态判断和循环体,只要当前状态判断为真,就执行循环体一遍,然后进行下一状态判断,判断为假时终止判断,形如 while (A)B <br />
</p>
<p>do语句和while相反,先执行循环体一遍,然后进行状态判断,状态判断为真,则继续执行循环体,否则终止循环,形如 do B while(A)</p>
<div class="jb51code">
<pre class="brush:scala;">
scala&gt; var m =3
m: Int = 3

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

scala&gt; var n =3
n: Int = 3

scala&gt; do{
   |println(n)
   |n -= 1
   | }while(n!=0)
3
2
1 </pre>
</div>
<p><strong>3) 枚举(for)</strong> <br />
</p>
<p>for的两种实现</p>
<div class="jb51code">
<pre class="brush:scala;">
scala&gt; for(i&lt;- 1 to 3)
   |   println(i)
1
2
3

scala&gt; for(i&lt;- 1 until 3)
   |   println(i)
1
2 </pre>
</div>
<p><strong>4) 匹配(match表达式) <br />
</strong></p>
<p>scala中的match类似于其他语言中的switch,从上往下进行匹配</p>
<div class="jb51code">
<pre class="brush:scala;">
scala&gt; val a = "gyt"
a: String = gyt

scala&gt; a match{
   |case "gyt" =&gt; println("OK")
   |case "cyan" =&gt; println("no")
   | }
OK </pre>
</div>
<p><strong>5) 异常处理(throw/try) <br />
</strong></p>
<p>Scala通过throw抛出一个异常,其异常捕获和处理与java十分类似</p>
<div class="jb51code">
<pre class="brush:scala;">
scala&gt; if(true){
   |println("throw new exception")
   |throw new IllegalArgumentException
   | }
throw new exception
java.lang.IllegalArgumentException
... 35 elided </pre>
</div>
<div class="jb51code">
<pre class="brush:scala;">
scala&gt; try{
   | val file = new FileReader("input.txt")
   | }catch{
   | case ex: FileNotFoundException =&gt; //handle missing file
   | case ex: IOException =&gt; //handle other I/O error
   | }finally{
   | println("end")
   | }
end </pre>
</div>
<p><strong>6) 输出(print/println) <br />
</strong></p>
<p>一个不换行输出,一个换行输出 <br />
</p>
<p><strong>7) 输入(readline) </strong><br />
</p>
<p>输入通常使用read函数,readline是从控制台输如一行,指定类型为readT,T为类型,例如</p>
<div class="jb51code">
<pre class="brush:scala;">
readscala&gt; val name = readLine(“Your Name: \n”)
warning: there was one deprecation warning; re-run with -deprecation for details
Your Name:
name: String = thinkgamer</pre>
</div>
<p><strong>8) 其他语句 </strong><br />
</p>
<p>return语言表示返回某个值,但是Scala事实上无需使用return语句,对于函数来说,其默认返回值是最后出现的一个值,不用特别注明,如需要返回的值,并非最后出现时,可在函数体后加上该值的标识符使之出现,声明函数时使用return语句,必须声明返回值类型,例如 def max:T = {return} <br />
</p>
<p>break/continue在C++中非常常见的控制结构语句,但在Scala中是不必要的,可以使用布尔值类型的两通过if语句进行控制</p>
<p><strong>3:数据结构 <br />
</strong></p>
<p><strong>1) 数组 </strong><br />
</p>
<p>使用new来实例化一个类,当你创建一个对象的实例时,你可以使用数值或者类型参数</p>
<div class="jb51code">
<pre class="brush:plain;">
scala&gt; val abc = new Array(3)
abc: Array = Array(null, null, null)
scala&gt; abc(0)="thinkgamer"
scala&gt; abc(1)="cyan"
scala&gt; abc(2)="GQ"
scala&gt; for(i&lt;- 0 to 2)
   |println(abc(i))
thinkgamer
cyan
GQ </pre>
</div>
<p>这里也说明下为什么Scala使用()来访问数组元素,在Scala中,数组和其他普遍的类的定义一样,没有什么特别之处,当你某个值后面使用()时,Scala将其翻译成对应对象的apply方法,因此本例中abc(0)其实调用abc.apply(0)方法,这种表达方法不仅仅只限于数据,对于任何对象,如果在其后面使用(),都将调用该对象的apply方法,同一,日过对某个使用()的对象复制,比如 <br />
abc(0)=”thinkgamer” <br />
</p>
<p>scala将这种复制转换为该对象的update方法,也就是abc.update(0,”thinkgamer”),因此上边的例子也可以使用传统的方法调用,可以写成:</p>
<div class="jb51code">
<pre class="brush:scala;">
scala&gt; val new_abc = new Array(3)
new_abc: Array = Array(null, null, null)
scala&gt; new_abc.update(0,"aaa")
scala&gt; new_abc.update(1,"bbb")
scala&gt; new_abc.update(2,"ccc")
scala&gt; for(i&lt;- 0 to 2)
   |println(new_abc(i))
aaa
bbb
ccc </pre>
</div>
<p>从这点来收,数组在scala中并不是某种特殊的数据类型,和普通的类并没有什么区别 <br />
</p>
<p>不过scala还是提供了初始化数组的简单的方法,上述的例子可以这样写:</p>
<div class="jb51code">
<pre class="brush:scala;">
scala&gt; val abc = Array("thinkgamer","cyan","GQ")
abc: Array = Array(thinkgamer, cyan, GQ)

数组的输出可以采用while或者foreach或者for进行输出
scala&gt; val abc = Array("thinkgamer","cyan","GQ")
abc: Array = Array(thinkgamer, cyan, GQ)
scala&gt; var i = 0
i: Int = 0
scala&gt; while(i&lt;abc.length){
   |println(abc(i))
   |i+=1
   | }
thinkgamer
cyan
GQ
scala&gt; abc.foreach(str=&gt;println(str))
thinkgamer
cyan
GQ </pre>
</div>
<p><strong>2):Lists <br />
</strong></p>
<p>Scala的List和Java不同,不能被改变,这样做的一个好处是方法与方法之间关联性较小,从而方法变得更可靠和重用性高,使用这个规则也就意味着变量的设置是不可修改的,这也就避免了多线程访问的互锁问题</p>
<div class="jb51code">
<pre class="brush:scala;">
scala&gt; val one = List(1,2,3)
one: List = List(1, 2, 3)
scala&gt; val two = List(4,5)
two: List = List(4, 5)
scala&gt; val three = one:::two
three: List = List(1, 2, 3, 4, 5) </pre>
</div>
<p>:::方法表示连接两个列表,当然列表定义了::方法(右操作符),用于向列表添加元素</p>
<div class="jb51code">
<pre class="brush:scala;">
scala&gt; val four = three::6::7::Nil
four: List = List(List(1, 2, 3, 4, 5), 6, 7)

scala&gt; val five = 1::2::3::4::Nil
five: List = List(1, 2, 3, 4) </pre>
</div>
<p><span style="color: #ff0000"><strong>Nil表示空列表 </strong></span><strong><br />
</strong></p>
<p>Scala的List类还定义了其他很多很有用的方法,比如head,last,length,reverse,tail等这里就不一一说明了,具体可以参考List的文档 <br />
</p>
<p><strong>3) Tuples </strong><br />
</p>
<p>Scala中另外一个很有用的容器类是Tupels,和Lists不同的Tuples可以包含不同类型的数据,而List只能包含同类型的数据,Tuples在方法需要返回多个结果时非常有用(Tuple对应数学的矢量的概念) <br />
</p>
<p>一旦定义了一个元组,可以使用._和索引来访问元组的元素(矢量的分量,注意和数组不同的是,元组的索引从1开始)</p>
<div class="jb51code">
<pre class="brush:scala;">
scala&gt; val pair = (22,"one")
pair: (Int, String) = (22,one)
scala&gt; println(pair._1)
22
scala&gt; println(pair._2)
one </pre>
</div>
<p>元组的实际类型取决于它的分量的类型,比如上边的pair的类型实际为Tuple2,目前Scala支持的元组的最大长度为22,如果有需要,你可以扩展更长的元组 <br />
</p>
<p><strong>4) Set</strong></p>
<div class="jb51code">
<pre class="brush:scala;">
scala&gt; var set = Set("a","b")
set: scala.collection.immutable.Set = Set(a, b)
scala&gt; set+="c"
scala&gt; set
res8: scala.collection.immutable.Set = Set(a, b, c)
scala&gt; println(set.contains("c"))
true </pre>
</div>
<p>缺省情况Set为Immutable Set,如果你需要使用可修改的集合类(Set类型),你可以使用全路径来指明Set,比如scala.collection.mutalbe.Set<br />
</p>
<p><strong>5) Map </strong><br />
</p>
<p>Map的基本用法如下(Map类似于其他语言中的关联数据如PHP)</p>
<div class="jb51code">
<pre class="brush:scala;">
scala&gt; val roman =Map(1-&gt;"I",2-&gt;"II")
roman: scala.collection.immutable.Map = Map(1 -&gt; I, 2 -&gt; II)
scala&gt; println(roman(1))
I
scala&gt; println(roman(2))
II </pre>
</div>
<p><span style="color: #ff0000"><strong>总结</strong></span></p>
<p>以上就是本文关于Scala基础简介及代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续浏览本站其他相关专题,有什么问题可以随时留言,小编会及时回复大家。感谢朋友们对本站的支持!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>Windows7下安装Scala 2.9.2教程</li><li>深入理解Scala函数式编程过程</li><li>Scala安装及环境图文配置教程</li><li>利用Gradle如何构建scala多模块工程的步骤详解</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Scala基础简介及代码示例