Scala学习(一)

1. Scala变量

a. 变量,使用关键字 "var"。常量使用关键字"val"

b. 变量类型声明:

var VariableName : DataType [=  Initial Value]
val VariableName : DataType [=  Initial Value]

2. Scala 访问修饰符

    private:带有此标记修饰的成员仅在包含了成员定义的类或对象内部可见,同样的规则还适用于内部类。

class Outer{
    class Inner{
    private def f(){println("f")}
    class InnerMost{
        f() // 正确
        }
    }
    (new Inner).f() //错误
}

    protected:比Java要严格一些,只允许在定义了该成员的类的子类中被访问。

3. Scala 函数

    Scala 函数定义格式如下:

def functionName ([参数列表]) : [return type] = {
   function body
   return [expr]
}

    函数式变成是scala语言的核心,主要分为函数传名调用、指定函数参数名、函数-可变参数、递归函数、默认参数值、高阶函数、内嵌函数、匿名函数、偏应用函数、函数柯里化

3.1 函数传名调用

函数的形参从 paraName:Type 变成 paraName: =>Type,表示在传入改参数时不计算,在正真调用的时候再计算。结果表明,fun3在调用前会先去计算fun1的值。
object ScalaApp {

  def fun1():Long = {
    println("fun1")
    return System.currentTimeMillis();
  }

  def fun2(t: =>Long )={     //函数传名调用
    println("fun2")
    println(t)
  }

  def fun3(t:Long)={         //函数传值调用
    println("fun3")
    println(t)
  }

  def main(args: Array[String]): Unit = {
    fun2(fun1)
    println("--------------")
    fun3(fun1)
  }
}

输出结果:

fun2
fun1
1490334605854
--------------
fun1
fun3
1490334605854

3.2 指定参数名

object Test {
   def main(args: Array[String]) {
        printInt(b=5, a=7);
   }
   def printInt( a:Int, b:Int ) = {
      println("Value of a : " + a );
      println("Value of b : " + b );
   }
}

3.3 可变参数

    Scala 通过在参数的类型之后放一个星号(*)来设置可变参数(可重复的参数)

3.4 闭包

    闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量。

    如一个匿名函数:val bifun = (t:Long) => t*10,下面函bifun就是一个闭包,可以通过访问函数外面的变量。

var param = 10
val bifun = (t:Long) => t*param

4. 基本类型和操作

4.1 对象相等

     == 不仅仅对基本类型有效,对列表也有效

     List(1,2,3) == List(1,2,3)

5. 类和对象

5.1 从构造器

    有些时候一个类需要多个构造器,Scala里主构造器之外的构造器被称为从构造器

class A(para_a:Int,para_b:AnyVal) {
  private val a = para_a;
  def this()=this(0,0)       //从构造器
  def fun():Int = {
    return 1
  }
}

5.2 定义操作符

class A{
  def + (a:Int): Unit ={  
  }
}

6. 使用try处理异常

def fun() ={
    try{
      throw new NullPointerException("")
    }catch{
      case ex:NullPointerException => ex.printStackTrace()
      case ex:Exception => ex.printStackTrace()
    }
  }

关于finally,在Java里,如果finally子句中包含一个显式返回语句,或抛出一个异常,那么这个返回值会凌驾于之前try代码块或catch子句产生的Exception之上。如:

def  f():Int = try{return 1}finally{return 2}  //调用f()产生的结果值是2。相反:

def g():Int = try{1}finally{2} //调用g()产生的结果值是1

所以,还是尽量避免在finally中包含返回值。

7. match表达式

val str = "ab"
    str match {
      case "a" => println("is a")
      case "b" => println("is b")
    }

8. 柯里化(Curry)

def sum(x:Int, y:Int) = x + y

def curriedSum(x:Int)(y:Int) = x + y    //柯里函数

>: curriedSum(1)(2)

这里你调用柯里函数curriedSum,你实际上调用了两个传统函数。第一个函数调用带单个名为x的Int参数,并返回第二个函数的函数值。第二个函数带Int参数y。下面名为first的函数实质上执行了curriedSum函数的第一个传统函数会做的事情:

def first(x:Int) = (y:Int) => x+y     //curriedSum的第一个函数返回的是一个函数

原文地址:https://www.cnblogs.com/felixpan/p/6651659.html