Scala学习笔记

Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的。

我们可以认为 Scala 程序是对象的集合,通过调用彼此的方法来实现消息传递。

类,对象,方法,实例变量的概念:

对象 - 对象有属性和行为。例如:一只狗的状属性有:颜色,名字,行为有:叫、跑、吃等。对象是一个类的实例。

类 - 类是对象的抽象,而对象是类的具体实例。

方法 - 方法描述的基本的行为,一个类可以包含多个方法。

字段 - 每个对象都有它唯一的实例变量集合,即字段。对象的属性通过给字段赋值来创建。

两种编程模式:

        交互式编程, 不需要写脚本,直接命令行输入;

        脚本模式写脚本文件,然后scalac 编译,scala 执行。

scala 换行符:

        Scala是面向行的语言,语句可以用分号(;)结束或换行符。Scala 程序里,语句末尾的分号通常是可选的。如果你愿意可以输入一个,但若一行里仅有一个语句也可不写。另一方面,如果一行里写多个语句那么分号是需要的。

Scala 非常简洁:比较Java 和 Scala 里是如何写类及构造函数的。

// 在 Java 里
class MyClass {
    private int index;
    private String name;
    public MyClass(int index, String name) {
        this.index = index;
        this.name = name;
    }
}
//在 Scala 里
class MyClass(index: Int, name: String)

根据这段代码,Scala编译器将制造有两个私有字段的类,一个名为 index 的 Int 类型和一个叫做 name 的 String 类型,还有一个用这些变量作为参数获得初始值的构造函数。这个构造函数还将用作为参数传入的值初始化这两个字段。

有助于 Scala 的简洁易懂的另一个因素是它的类型推断。重复的类型信息可以被忽略,因此程序变得更有条理和易读。

函数式风格:Scala 允许你用指令式风格编程,但是鼓励你采用一种更函数式的风格。

通向更函数式风格路上的第一步是识别这两种风格在代码上的差异。
如果代码包含了任何 var 变量,那它大概就是指令式的风格

如果代码根本就没有var ——就是说仅仅包含 val ——那它大概是函数式的风格。因此向函数式风格推进的一个方式,就是尝试不用任何 var 编程。

// 指令式风格:
def printArgs(args: Array[String]): Unit = {
    var i = 0
    while (i < args.length) {
        println(args(i))
        i += 1
    }
}
// 可以通过去掉 var 的办法把这个代码变得更函数式风格:
def printArgs(args: Array[String]): Unit = {
    for(arg <- args):
        println(arg)
}
// 或者这样
def printArgs(args: Array[String]): Unit = {
    args.foreach(println)
}

面向对象 :Scala 是纯粹格式的面向对象语言:每个值都是对象,每个操作都是方法调用。

Scala 比 Java 更面向对象的一个方面是 Scala 没有静态成员Scala 有单例对象: singleton object。除了用 object 关键字替换了 class 关键字以外,单例对象的定义看上去就像是类定义

import scala.collection.mutable.Map
object ChecksumAccumulator {
    private val cache = Map[String, Int]()
    def calculate(s: String): Int =
        if (cache.contains(s))
            cache(s)
        else {
            val acc = new ChecksumAccumulator
            for (c <- s)
                acc.add(c.toByte)
            val cs = acc.checksum()
            cache += (s -> cs)
            cs
        }
}

类和单例对象间的一个差别是,单例对象不带参数,而类可以。因为你不能用 new 关键字实例化一个单例对象,你没机会传递给它参数。每个单例对象都被作为由一个静态变量指向的虚构类:synthetic class的一个实例来实现,因此它们与Java静态类有着相同的初始化语法。 特别要指出的是,单例对象会在第一次被访问的时候初始化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值