首页 > 其他 > 详细

Scala2.11.7学习笔记(三)

时间:2015-09-28 19:18:11      阅读:196      评论:0      收藏:0      [点我收藏+]

欢迎访问:鲁春利的工作笔记,学习是一种信仰,让时间考验坚持的力量。



1、定义一些函数

scala> def max(x:Int, y:Int) : Int = {
     |     if (x > y) {
     |         x
     |      } else {
     |         y
     |      }
     | };
max: (x: Int, y: Int)Int
scala> max(4, 5)
res8: Int = 5

    无返回值的函数:

scala> def greet() = println("hello,world")
greet: ()Unit

scala> greet();
hello,world

    greet函数的返回值类型为Unit 表示该函数不返回任何有意义的值,Unit类似于Java中的void类型。


2、使用数组

scala> var greetStrings = new Array[String](3)
greetStrings: Array[String] = Array(null, null, null)

scala> greetStrings(0) = "Hello"

scala> greetStrings(1) = ","

scala> greetStrings(2) = "World"

scala> for (i <- 0 to 2)
     |   print(greetStrings(i))
Hello,World
scala>

    Scala使用方括号来指明数据类型,而非尖括号。本例使用String类型,数组使用()而非[]来指明数组的索引。其中的for表达式中使用到 0 to 2,如果一个方法只有一个参数,你可以不用括号和. 来调用这个方法。

    这里的 0 to 2, 其实为(0).to(2) ,调用的为整数类型的 to方法,to方法使用一个参数。Scala中所有的基本数据类型也是对象(和Java不同),因此0 可以有方法(实际上调用的是RichInt的方法)。这种只有一个参数的方法可以使用操作符的写法(不用.和括号),实际上Scala中表达式 1+2 ,最终解释为(1).+(2) ,+也是Int的一个方法,和Java不同的是,Scala对方法的名称没有太多的限制。

scala> val greetStrings =Array("Hello",",","World")
greetStrings: Array[String] = Array(Hello, ,, World)


3、使用Lists

    Scala中提供了Lists类,和Java的List不同,Scala的Lists对象是不可修改的。

scala> val oneTwo = List(1, 2)
oneTwo: List[Int] = List(1, 2)

scala> val threeFor = List(3, 4)
threeFor: List[Int] = List(3, 4)

scala> val oneTwoThreeFor = oneTwo ::: threeFor
oneTwoThreeFor: List[Int] = List(1, 2, 3, 4)

scala> println (oneTwo + " and " + threeFor + " were not mutated.")
List(1, 2) and List(3, 4) were not mutated.

scala> println ("Thus " + oneTwoThreeFor + " is a new List.")
Thus List(1, 2, 3, 4) is a new List.

scala>

    :::操作符(其实为:::方法)将两个列表链接起来。

    List也提供了一个::方法用来向List中添加一个元素,::方法(操作符)是右操作符,也就是使用::右边的对象来调用它的::方法。Scala中规定所有以:开头的操作符都是右操作符,因此如果自定义以:开头的方法(操作符)也是右操作符。

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

scala> println (oneTwoThreeA)
List(1, 2, 3)

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

scala> println (oneTwoThreeB)
List(1, 2, 3)
scala> println (oneTwoThreeB.head)
1

scala> println (oneTwoThreeB.length)
3

scala> println (oneTwoThreeB.reverse)
List(3, 2, 1)

scala>


4、使用元组

    Scala 中另外一个很有用的容器类为Tuples,和List不同的Tuples可以包含不同类型的数据,而List只能包含同类型的数据。
    一旦定义了一个元组,可以使用._和索引来访问员组的元素(矢量的分量,注意和数组不同的是,元组的索引从1开始)。

scala> val paris=(123, "abc")
paris: (Int, String) = (123,abc)

scala> println (paris._1);
123

scala> println (paris._2);
abc

scala>


5、使用Sets和Maps

    不同的Scala中的Trait(类似于Java中的Interface),分两个包定义Mutable(可变)和Immutable(不可变)。   

scala.collection.Set
    scala.collection.immutable.Set---不可变
        scala.collection.immutable.HashSet
    scala.collection.mutable.Set---可变
        scala.collection.mutable.HashSet
scala> var jetSet = Set("Boeing", "Airbus");
jetSet: scala.collection.immutable.Set[String] = Set(Boeing, Airbus)
scala> jetSet += "Lear";

scala> println(jetSet.contains("Cessna"));
false

scala> println(jetSet.contains("Lear"));
true

scala>

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

    Scala提供的另外一个类型为Map类型,Scala也提供了Mutable和Immutable 两种Map类型

scala.collection.Map
    scala.collection.immutable.Map
        scala.collection.immutable.HashMap
    scala.collection.mutable.Map
        scala.collection.mutable.HashMap
scala> val romanNum = Map( 1-> "I", 2 -> "II", 3 -> "III", 4 -> "IV");
romanNum: scala.collection.immutable.Map[Int,String] = Map(1 -> I, 2 -> II, 3 -> III, 4 ->

scala> println (romanNum(3));
III

scala> val newMap = Map ("a" -> "Hello", "b" -> "World", "c" -> "!");
newMap: scala.collection.immutable.Map[String,String] = Map(a -> Hello, b -> World, c -> !)

scala> println (newMap ("a"));
Hello

scala>

    6、函数式编程

def printArgs (args : Array[String]) : Unit = {
    var i = 0;
    while (i < args.length) {
        println(args(i));
        i += 1;
    }
};

    来自Java背景的程序员开始写Scala代码很有可能写成上面的实现。试着去除vars变量,可以写成跟符合函数式编程的代码:

def printArgs (args : Array[String]) : Unit = {
    for (arg -> args) {
        println(arg);
    }
};
或者更简化为:
def printArgs (args : Array[String] ) : Unit = {
    args.foreach(println);
};

    这个例子也说明了尽量少用vars的好处,代码更简洁和明了,从而也可以减少错误的发生。因此Scala编程的一个基本原则上,能不用vars,尽量不用vars,能不用mutable变量,尽量不用mutable变量,能避免函数的副作用,尽量不产生副作用。


7、读取文件

import scala.io.Source;
if (args.length > 0) {
    for (line <- Source.fromFile(args(0)).getLines()) {
        println(line.length + "\t" + line);
    }
} else {
    Console.err.println("Please enter filename.");
}

    test.txt文件内容

One World
One Dream

    调用

G:\Hadoop\scala-SDK\source>scala printargs.scala test.txt
9       One World
9       One Dream

G:\Hadoop\scala-SDK\source>scala printargs.scala
Please enter filename.

    Scala引入包的方式和Java类似,也是通过import语句。文件相关的类定义在scala.io包中。 如果需要引入多个类,Scala使用 “_” 而非 “*”。

本文出自 “鲁春利的工作笔记” 博客,请务必保留此出处http://luchunli.blog.51cto.com/2368057/1698784

Scala2.11.7学习笔记(三)

原文:http://luchunli.blog.51cto.com/2368057/1698784

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!