Scala 基础

创建项目

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.baozi</groupId>
  <artifactId>scala-learning</artifactId>
  <version>1.0</version>

  <properties>
    <scala.version>2.11.8</scala.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-library</artifactId>
      <version>${scala.version}</version>
    </dependency>
  </dependencies>

  <build>
    <sourceDirectory>src/main/scala</sourceDirectory>
    <testSourceDirectory>src/test/scala</testSourceDirectory>
    <plugins>
      <plugin>
        <groupId>org.scala-tools</groupId>
        <artifactId>maven-scala-plugin</artifactId>
        <version>2.15.0</version>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>testCompile</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

</project>

启动应用程序

// 1.通过main方法
object Hello {
  def main(args: Array[String]): Unit = {
    println("Hello")
  }
}

// 2.也可以通过继承App
object Hello extends App{
  println("Hello")
}

数据类型

Scala数据类型.jpeg
// 可以声明类型,Scala也会自动推断类型
// Byte|Char|String|Short|Int|Long|Float|Double|Boolean
val myByte: Byte = 1
val myChar: Char = 'a'
val myString: String = "ABC"
val myShort: Short = 1
val myInt: Int = 1
val myLong: Long = 1
val myFloat: Float = 1.0F // 加f/F
val myDouble: Double = 1.0
val myBoolean: Boolean = true

// Any    : 所有类的父类
// Nothing: 所有类的子类
//    val myAny: Any = 任何值
//    val myNothing: Nothing = 不知道怎么赋值,也不知道怎么用

// AnyVal: 所有值类型  的父类
// AnyRef: 所有引用类型的父类
// Null  : 所有引用类的子类,null
val myAnyVal: AnyVal = 1
val myAnyRef: AnyRef = "1"
val myNull: Null = null
    
// Unit: void返回值,只有一个实例值()
val myUnit: Unit = ()

类型转换 & 判断类型

10.asInstanceOf[Double] // 转换类型: 10.0
10.isInstanceOf[Int] // 类型判断: true

字符串高级操作

// 字符串
val str = "ABC"
val strs =
  """
    |A
    |B
    |C
  """.stripMargin
println(str)  // ABC

println(strs) // A
              // B
              // C

// 字符串引用变量
val name = "baozi"
val strName = s"name: $name"
val strsName =
  s"""
     |name: $name
     |name: $name
   """.stripMargin
println(strName)  // name: baozi

println(strsName) // name: baozi
                  // name: baozi

条件表达式

val predicate = 1
// 1. if else
if (predicate > 0) true else false
// 2. 将结果赋值给变量
val res1 = if (predicate > 0) true else false
// 3. if  else if  else
if (predicate < 0) {
  println("<0")
} else if (predicate == 0) {
  println("=0")
} else {
  println(">0")
}

循环表达式

// for -----------------
for (num <- 1 to 10) {
  println(num)
}
for (str <- Array("A", "B", "C", "D", "E")){
  println(str)
}
for (num <- 1 to 10 if num%2 == 0; if num < 10) {
    println(num)
}
val res = for (i <- 1 to 10 if i < 5 ) yield (i * 2)
println(res)



// foreach -----------------
(1 to 10).foreach(num => println(num))
1.to(10).foreach(num => println(num))
1.to(10).foreach(println)

// while -----------------
//  var num = 100
//  var sum = 0
var (num, sum) = (100, 0)
while (num > 0) {
  sum += num
  num = num - 1
}
println(sum)

使用函数

// 1 + 2  改成方法调用=>  1.+(2)
// Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
1 to 10
1.to(10)
// Range(1, 2, 3, 4, 5, 6, 7, 8, 9)
1 until 10
1.until(10)
// (小, 大, +step),  (大, 小, -step)
Range(1, 10)     // Range(1, 2, 3, 4, 5, 6, 7, 8, 9)
Range(1, 10, 1)  // Range(1, 2, 3, 4, 5, 6, 7, 8, 9)
Range(1, 10, 2)  // Range(1, 3, 5, 7, 9)
Range(10, 1, -1) // Range(10, 9, 8, 7, 6, 5, 4, 3, 2)
Range(10, 1, -2) // Range(10, 8, 6, 4, 2)

Scala关键字

sealed: 禁止在该文件以外声明子类

Scala操作符

def sum(nums: Int*): Int = {
  if (nums.isEmpty){
    0
  } else {
    // nums.tail返回的是Seq[Int], 使用:_*转成符合方法参数的形式(例如:1,2,3,4....
    nums.head + sum(nums.tail:_*)
  }
}

call-by-value和call-by-name

def myFunc(): Int ={
  println("计算值...")
  42
}

// call-by-value: 调用函数之前就计算
/*
  计算值...
  1: 42
  2: 42
 */
def callByValue(x: Int): Unit = {
  println("1: " + x)
  println("2: " + x)
}

// call-by-name: 用到时才计算
/*
  计算值...
  1: 42
  计算值...
  2: 42
 */
def callByName(x: => Int): Unit = {
  println("1: " + x)
  println("2: " + x)
}

// 调用
callByValue(myFunc())
callByName(myFunc())

Null Nil None Nothing的区别

Null:表示空引用,所有引用类的子类
Nil:表示空List
Nothing:所有类的子类
None:Option的子类,表示无值; Option用作返回值; Some也是Option的子类,表示有值。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容