[learning Scale]Functionsベース
4732 ワード
object SparkTest003 {
def main(args: Array[String]): Unit = {
/*
* Chapter 4 functions
*/
def jump(title: String = ""): Unit = print(s"
---------${title}-----------
")
// a scala function is a named wrapper for an expression
def greeting = "greeting!"
print(greeting)
print("
")
// def <identifier>: <type> = <expression>
def greeting2: String = "greeting with return value!"
def greeting2_1(): String = "greeting with empty parenthesis!" // Functions with Side Effects Should Use Parentheses
print(s"func: ${greeting2}
")
//def <identifier>(<identifier>: <type>[, ... ]): <type> = <expression>
def greeting3(x: Int, y: Int): String = {
s"x: $x, y: $y, res: ${x * y}"
}
print(s"${greeting3(3, 4)}
")
// A procedure is a function that doesn’t have a return value.
def logs(d: Double): Unit = println(f"the value is $d%.2f")
logs(3.1415926)
jump("Invoking a Function with an Expression Block")
def formatArea(a: Double): Double = {
f"$a%.3f".toDouble
}
print {
formatArea {
val r = 1.0
val pai = 3.1415
r * pai
}
}
jump("recursive function")
//@annotation.tailrec
def fibonacci (n: Long): Long = {
if (n > 1) fibonacci(n - 1) + fibonacci(n - 2)
else 1L
}
// can't be auto change to tail recursive, because the final expression is sum, not call functions
def fibonacci_tail_recursive (n: Long): Long = {
if (n <= 1) 1L
else fibonacci_tail_recursive(n - 1) + fibonacci_tail_recursive(n - 2)
}
@annotation.tailrec
def pow(x: Int, n: Int, res: Int = 1): Int = {
if (n <= 0) res
else pow(x, n - 1, res * x)
}
print(fibonacci_tail_recursive(10L))
print(s"
res: ${pow(3, 3)}")
jump("nested functions")
def max(x: Int, y: Int, z: Int): Int = {
def max(x: Int, y: Int): Int = if (x < y) y else x
max(x, max(y, z))
}
print(s"the max of three numbers is : ${max(1, 3, 2)}")
jump("Calling Functions with Named Parameters")
def greet(prefix: String, name: String): Unit = {
print(s"hello: ${prefix} ${name}
")
}
greet("Ms", "Sandy")
greet(name = "Sandy", prefix = "Ms")
jump("Vararg Parameters")
def count(items: Int*): Int = {
var cnt = 0
for (i <- items) cnt += 1
cnt
}
print(count(1, 2, 3, 4))
jump("Type Parameters: like C++ template")
def identify[A](a: A): A = a
val d: Double = identify[Double](3.14)
val dd: Double = identify(3.14)
val ddd = identity(3.14)
val s: String = identify[String]("hello type parameters")
val ss: String = identify("hello type inference")
val sss = identity("hello type inference and return inference!")
print(s"d is : ${ddd}, s is: ${sss}")
jump("Methods and operators")
}
}