简介

Scala是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序。

优点

  • 优雅:这是框架设计师第一个要考虑的问题,框架的用户是应用开发程序员,API是否优雅直接影响用户体验。
  • 速度快:Scala语言表达能力强,一行代码抵得上Java多行,开发速度快;Scala是静态编译的。
  • 能融合到hadoop生态圈:Hadoop现在是大数据事实标准,Spark并不是要取代Hadoop,而是要完善Hadoop生态。JVM语言大部分可能会想到Java,但Java做出来的API太丑,或者想实现一个优雅的API太费劲。

Scala常识

  1. 约定
    object:指scala中的特殊的单例对象,注意不要把object翻译成对象,以
    免冲突
    对象:指new关键字所创建的实例,和java中的对象指代同一事物
    类 :和java语言指代一样
    方法:和java语言指代一样,也可以叫操作
    函数:指的是某种特殊的实例,与方法不能混为一谈
    特质:类似java接口,但比接口强大
    字段:也叫属性

  2. 编程规范
    区分大小写:Scala是大小写敏感的,这意味着标识Hello和hello在Scala中会有不同的含义。

    标识符:Scala可以使用两种形式的标志符,字符数字和符号。字符数字使用字母或是下划线开头,后面可以接字母或是数字,符号”$”在Scala中也看作为字母。然而以”$”开头的标识符为保留的 Scala 编译器产生的标志符使用,应用程序应该避免使用”$”开始的标识符,以免造成冲突。

    类名:对于所有的类名的第一个字母要大写。如果需要使用几个单词来构成一个类的名称,每个单词的第一个字母要大写。
    示例:class MyFirstScalaClass

    方法名称:所有的方法名称的第一个字母用小写。
    如果若干单词被用于构成方法的名称,则每个单词的第一个字母应大写。
    示例:def myMethodName()

    程序文件名:程序文件的名称应该与对象名称完全匹配。
    保存文件时,应该保存它使用的对象名称(记住Scala是区分大小写),并追加”.scala”为文件扩展名。(如果文件名和对象名称不匹配也可以)。

    代码语句分割:scala语句分割是英文分号(;)或换行,一条语句单独占一行时可省略分号,多条语句在一行时语句与语句之间的分号不可省略,
    如: [1] val str = “scala 简学 ”; println(str)
    [2] val hello = “Hello Scala”
    [3] println(hello)

  3. 程序入口
    和其他语言一样,main方法都是操作系统调度执行时的执行入口,其为固定写
    法:

    1
    2
    3
    4
    5
    object HelloScala {
    def main(args: Array[String]): Unit = {
    //edit your code
    }
    }

注:main方法必须在单例对象object中

  1. App特质
    在 Scala中有一个特殊的特质,即App特质,一个预先定义好了main方法的特质,因此一个继承了App特质的object代码不需要主方法也可运行

Scala基础

数据类型

Scala 中的面向对象更彻底,在 scala 语言的世界中,万物皆对象。其中最显著的就
是摒弃了基本数据类型(语法上),即放弃加减乘除等这些操作,取而代之的是加减乘除
方法。Scala 中的类层次结构图如下:
类层次结构图

包操作

  1. 定义包

    • 第一种:和Java一样,在文件头定义包名,后续所有代码都放在
      该包中。

      1
      2
      package com.runoob
      class HelloWorld
    • 第二种:类似C#, 可以在一个文件中定义多个包。

      1
      2
      3
      package com.runoob {
      class HelloWorld
      }
  2. 引用包
    和Java一样使用import关键字导入包

    1
    2
    3
    4
    5
    6
    import java.awt.Color // 引入 Color
    import java.awt._ // 引入包内所有成员,
    import java.awt.{Color, Font}
    import java.util.{HashMap => JavaHashMap}// 重命名成员
    // 引入了 util 包的所有成员,但是 HashMap 被隐藏了
    import java.util.{HashMap => _, _}

声明变量

1
2
3
4
5
6
7
8
9
10
11
object VariableDemo {
def main(args: Array[String]) {
//使用val定义的变量值是不可变的,相当于java里用final修饰的变量
val i = 1
//使用var定义的变量是可变的,在Scala中鼓励使用val
var s = "hello"
//Scala编译器会自动推断变量的类型,必要的时候可以指定类型
//变量名在前,类型在后
val str: String = "world"
}
}

条件表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
object ConditionDemo {
def main(args: Array[String]) {
val x = 1
//判断x的值,将结果赋给y
val y = if (x > 0) 1 else -1
//打印y的值
println(y)
//支持混合类型表达式
val z = if (x > 1) 1 else "error"
//打印z的值
println(z)
//如果缺失else,相当于if (x > 2) 1 else ()
val m = if (x > 2) 1
println(m)
//在scala中每个表达式都有值,scala中有个Unit类,写做(),相当于Java中的void
val n = if (x > 2) 1 else ()
println(n)
//if和else if
val k = if (x < 0) 0
else if (x >= 1) 1 else -1
println(k)
}
}

循环表达式

在scala中有for循环和while循环,用for循环比较多,while循环和java的一样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
object TestFor {
def main(args: Array[String]): Unit = {
// i to j 语法(包含j)[i,j]
// 可设置步长,默认为1
println("to语法:")
for (i <- 1 to (10,2)){
println(i)
}
// i until j 语法(不包含j)[i,j)
println("until语法:")
for (i <- 1 until 10){
println(i)
}
// 使用分号 (;) 来设置多个区间,它将迭代给定区间所有的可能值
println("多个区间:")
for( a <- 1 to 3; b <- 1 to 3){
println( "Value of a: " + a );
println( "Value of b: " + b );
}
// 遍历集合元素
println("遍历集合元素:")
var list = List(1,2,3,4,5)
for (i <- list){
println(i)
}
// 循环过滤,使用分号(;)来为表达式添加一个或多个的过滤条件
println("循环过滤:")
for (i <- list if i != 3; if i > 2){
println(i)
}
// 使用yield将for循环的返回值作为一个变量存储
println("yield:")
var tem = for { i <- list if i != 3 if i > 2 }yield -i*2
// 相当于
var tem2 = list.filter(_ != 3).filter(_ > 2).map(_ * -2)
for (i <- tem2){
println(i)
}
}
}

最后更新: 2018年10月22日 17:03

原始链接: https://www.lousenjay.top/2018/09/30/Scala入门详解(一)/