当前位置:K88软件开发文章中心编程语言SQLscala → 文章内容

基础

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-19 4:45:22

由 Shaodengdeng 创建,小路依依 最后一次修改 2016-08-12 基础 关于这节课 最初的几个星期将涵盖基本语法和概念,然后我们将通过更多的练习展开这些内容。 有一些例子是以解释器交互的形式给出的,另一些则是以源文件的形式给出的。 安装一个解释器,可以使探索问题空间变得更容易。 为什么选择 Scala? 表达能力 函数是一等公民 闭包 简洁 类型推断 函数创建的文法支持 Java互操作性 可重用 Java 库 可重用 Java 工具 没有性能惩罚 Scala 如何工作? 编译成 Java 字节码 可在任何标准 JVM 上运行 甚至是一些不规范的JVM上,如 Dalvik Scala 编译器是 Java 编译器的作者写的 用 Scala 思考 Scala 不仅仅是更好的 Java。你应该用全新的头脑来学习它,你会从这些课程中认识到这一点的。 安装 Scala 请看:Scala 安装及环境配置 启动解释器 使用自带的 sbt console 启动。$ sbt console[...]Welcome to Scala version 2.8.0.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_20).Type in expressions to have them evaluated.Type :help for more information.scala> 表达式scala> 1 + 1res0: Int = 2 res0 是解释器自动创建的变量名称,用来指代表达式的计算结果。它是 Int 类型,值为 2。 Scala 中(几乎)一切都是表达式。 值 你可以给一个表达式的结果起个名字赋成一个不变量(val)。scala> val two = 1 + 1two: Int = 2 你不能改变这个不变量的值。 变量 如果你需要修改这个名称和结果的绑定,可以选择使用 var。scala> var name = "steve"name: java.lang.String = stevescala> name = "marius"name: java.lang.String = marius 函数 你可以使用 def 创建函数.scala> def addOne(m: Int): Int = m + 1addOne: (m: Int)Int 在 Scala 中,你需要为函数参数指定类型签名。scala> val three = addOne(2)three: Int = 3 如果函数不带参数,你可以不写括号。scala> def three() = 1 + 2three: ()Intscala> three()res2: Int = 3scala> threeres3: Int = 3 匿名函数 你可以创建匿名函数。scala> (x: Int) => x + 1res2: (Int) => Int = <function1> 这个函数为名为 x 的 Int 变量加 1。scala> res2(1)res3: Int = 2 你可以传递匿名函数,或将其保存成不变量。scala> val addOne = (x: Int) => x + 1addOne: (Int) => Int = <function1>scala> addOne(1)res4: Int = 2 如果你的函数有很多表达式,可以使用 {} 来格式化代码,使之易读。def timesTwo(i: Int): Int = { println("hello world") i * 2} 对匿名函数也是这样的。scala> { i: Int => println("hello world") i * 2}res0: (Int) => Int = <function1> 在将一个匿名函数作为参数进行传递时,这个语法会经常被用到。 部分应用(Partial application) 你可以使用下划线“”部分应用一个函数,结果将得到另一个函数。Scala 使用下划线表示不同上下文中的不同事物,你通常可以把它看作是一个没有命名的神奇通配符。在`{ + 2 }`的上下文中,它代表一个匿名参数。你可以这样使用它:scala> def adder(m: Int, n: Int) = m + nadder: (m: Int,n: Int)Intscala> val add2 = adder(2, _:Int)add2: (Int) => Int = <function1>scala> add2(3)res50: Int = 5 你可以部分应用参数列表中的任意参数,而不仅仅是最后一个。 柯里化函数 有时会有这样的需求:允许别人一会在你的函数上应用一些参数,然后又应用另外的一些参数。 例如一个乘法函数,在一个场景需要选择乘数,而另一个场景需要选择被乘数。scala> def multiply(m: Int)(n: Int): Int = m * nmultiply: (m: Int)(n: Int)Int 你可以直接传入两个参数。scala> multiply(2)(3)res0: Int = 6 你可以填上第一个参数并且部分应用第二个参数。scala> val timesTwo = multiply(2) _timesTwo: (Int) => Int = <function1>scala> timesTwo(3)res1: Int = 6 你可以对任何多参数函数执行柯里化。例如之前的 adder 函数scala> (adder _).curriedres1: (Int) => (Int) => Int = <function1> 可变长度参数 这是一个特殊的语法,可以向方法传入任意多个同类型的参数。例如要在多个字符串上执行 String 的 capitalize 函数,可以这样写:def capitalizeAll(args: String*) = { args.map { arg => arg.capitalize }}scala> capitalizeAll("rarity", "applejack")res2: Seq[String] = ArrayBuffer(Rarity, Applejack) 类scala> class Calculator { | val brand: String = "HP" | def add(m: Int, n: Int): Int = m + n | }defined class Calculatorscala> val calc = new Calculatorcalc: Calculator = Calculator@e75a11scala> calc.add(1, 2)res1: Int = 3scala> calc.brandres2: String = "HP" 上面的例子展示了如何在类中用 def 定义方法和用 val 定义字段值。方法就是可以访问类的状态的函数。 构造函数 构造函数不是特殊的方法,他们是除了类的方法定义之外的代码。让我们扩展计算器的例子,增加一个构造函数参数,并用它来初始化内部状态。class Calculator(brand: String) { /** * A constructor. */ val color: String = if (brand == "TI") { "blue" } else if (brand == "HP") { "black" } else { "white" } // An instance method. def add(m: Int, n: Int): Int = m + n} 注意两种不同风格的评论。 你可以使用构造函数来构造一个实例:scala> val calc = new Calculator("HP")calc: Calculator = Calculator@1e64cc4dscala> calc.colorres0: String = black 表达式 上文的 Calculator 例子说明了 Scala 是如何面向表达式的。颜色的值就是绑定在一个if/else表达

[1] [2]  下一页


基础