SCALA August 20, 2018

Scala基础

Words count 5.6k Reading time 5 mins. Read count 0

变量

三种变量修饰符

val 定义immutable variable 常量

var 定义 mutable variable 变量

lazy val 惰性求值

scala> lazy val f= 1*4
f: Int = <lazy>
scala> f
res22: Int = 4

数据类型

scala> val name:String = "srk"
name: String = srk

scala> s"name is ${name}"
res0: String = name is srk

函数和代码块

代码块

函数

def hello(name: String): String = {
  s"hello,${name}"
}
hello("shirukai")

def add(x:Int,y:Int)=x+y
add(1,5)

if表达式

if(条件) valA else valB

if(true) 1 else 2
if(false) 3 else 4

val a = 1
if (a == 1) a
if (a != 1) "not one"
if (a != 1) "not one" else a

for comprechension

实现循环

try表达式

try{}

catch{}

finally{}

例如:

//try表达式
try {
  Integer.parseInt("dog")
} catch {
  case _: Exception => 0
} finally {
  println("always be printed")
}

match 表达式

类似于java中的switch

exp match{
 case p1 => val1
 case p2 => val2
 ……
 case _ = valn
}

例如

//match 表达式
val code = 4
val result_match =
  code match {
    case 1 => "one"
    case 2 => "two"
    case _ => "others"
  }

求值策略

例子:

高阶函数

用函数作为参数类型或返回值的函数,称为高阶函数

匿名函数

柯里化

柯里化函数把具有多阿哥参数的函数转换为一条函数连,每个节点上是单一参数。

def curriedAdd(a: Int)(b: Int) = a + b
val addOne = curriedAdd(1)_
addOne(4)

递归与尾递归

递归函数在函数式编程中是实现循环的一种技术

//计算n!
def factorial(n: Int): Int = {
  if (n <= 0) 1
  else n * factorial(n - 1)
}
factorial(8)

尾递归

尾递归函数中所有递归形式的调用都出现在函数的末尾。当编译器检测到一个函数调用的是尾递归的时候,它就会覆盖当前的活动记录而不是在栈中去创建一个新的。

@annotation.tailrec
def factorial2(n: Int, m: Int): Int = {
  if (n <= 0) m
  else factorial2(n - 1, m * n)
}
factorial2(5,1)

例子

def sum(f: Int => Int)(a: Int)(b: Int): Int = {
  @annotation.tailrec
  def loop(n: Int, acc: Int): Int = {
    if (n > b) {
      println(s"n=${n}, acc=${acc}")
      acc
    }
    else {
      println(s"n=${n}, acc=${acc}")
      loop(n + 1, acc + f(n))
    }
  }

  loop(a, 0)
}

sum(x => x)(1)(5)
sum(x => x * x)(1)(5)
sum(x => x * x * x)(1)(5)
val sumSquare = sum(x => x * x) _
sumSquare(1)(5)

集合

List[T]

list过滤

val a = List(1, 2, 3, 4)
a.filter(x => x % 2 == 1)

例子:取出字符串中的数字,并转为list

"99 Red Balloons".toList.filter(x => Character.isDigit(x))

takeWhile

达到某个条件之前一直取数

"99 Red Balloons".toList.takeWhile(x => x != 'B')

map

映射list里的元素

val c = "x" :: "y" :: "z" :: Nil
c.map(x => x.toUpperCase)
res13: List[String] = List(X, Y, Z)
a.filter(_ % 2 == 1).map(_ + 10)
0%