Scala入门详解(一)

个人博客原文链接

简介

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中也看作为字母。然而以"“开头的标识符为保留的 Scala 编译器产生的标志符使用,应用程序应该避免使用”$"开始的标识符,以免造成冲突。

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

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

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

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

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

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一样,在文件头定义包名,后续所有代码都放在
      该包中。
      package com.runoob
      class HelloWorld
      
    • 第二种:类似C#, 可以在一个文件中定义多个包。
      package com.runoob {
          class HelloWorld
      }
      
  2. 引用包
    和Java一样使用import关键字导入包
    import java.awt.Color // 引入 Color
    import java.awt._ // 引入包内所有成员,
    import java.awt.{Color, Font}
    import java.util.{HashMap => JavaHashMap}// 重命名成员
    // 引入了 util 包的所有成员,但是 HashMap 被隐藏了
    import java.util.{HashMap => _, _}
    

声明变量

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

条件表达式

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的一样

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)
    }

  }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章