Scala学习笔记(二)

Scala是哪些,能做怎样?

Scala是一门多范式的编制程序语言,一系列似java的编制程序语言
,设计初衷是兑现可伸缩的语言、并集成面向对象编制程序和函数式编制程序的各类风味。

近期,Scala 在海外相比火,推特(TWTR.US) 已经将本身一切的代码从 Ruby
转到了Scala。而且还有 Spark、Kafka、akka 那样的开源项目及
照片墙、Linkedin 等店铺着力支持,所以笔者很看好 Scala 那门语言。

Scala的基础语法

本身收拾了友好学习进度中感到有须求记录的东西,防止忘记

1. val 与 var

Scala 有二种概念变量的措施:val和var。

当val定义好变量之后,不恐怕更改变量的值。类似于选择了Java的final来修饰变量。

scala> val param = "tony"
param: String = tony

scala> param = "monica"
<console>:12: error: reassignment to val
       param = "monica"
             ^

var定义的变量,能够频繁改动变量的值

scala> var param = "tony"
param: String = tony

scala> param = "monica"
param: String = monica

scala> println (param)
monica

有三个建议,Scala 程序员崇尚使用val,不可变对象和尚未副作用的艺术。

2. 关于for循环

2.1 to关键字

跟Java区别,Scala 的for循环变得很简短,间接利用to要害词就能够了

scala> for (i<- 1 to 10) {
     |  println ("i is " + i)
     | }
i is 1
i is 2
i is 3
i is 4
i is 5
i is 6
i is 7
i is 8
i is 9
i is 10

2.2 until关键词

也得以运用until关键词

scala> for (i<- 1 until 10) {
     |  println("i is " + i)
     | }
i is 1
i is 2
i is 3
i is 4
i is 5
i is 6
i is 7
i is 8
i is 9

能够见到,until和to的分裂之处在于不包含最终三个要素。

2.3 遍历集合

读取根目录下有所文件

scala> val files = (new java.io.File(".")).listFiles()

scala> for (file <- files) {
     |  println(file)
     | }
./.android
./.bash_history
./.bash_sessions
./.bashrc
./.CFUserTextEncoding
./.dir_colors
./.DS_Store
./.fonts
./.gdbinit
./.gimp
./.gitconfig
./.gitignore
./.gitignore_global
./.gradle

...

2.4 for循环和if条件语句一起行使

Java,打字与印刷1到10,并且过滤出超过5的数字

scala>  for (i<- 1 to 10 if i>5) {
     |    println(i)
     | }
6
7
8
9
10

上边包车型地铁代码,对于Java版本须求这么写

for (int i=1;i++;i<=10) {
     if (i>5) {
           System.out.println(i)
     }
}

所以,在 Scala 的for循环语句中能够选取if语句来做for循环的规格过滤。
同时,for循环中还援助多个if条件,三个if之间须要用“;”来划分。

3. yield的用法

yield
会构造并赶回与给定集合相同档次的成团。yield要求格外for循环来使用。
先看yield的用法

for {子句} yield {变量或表达式}

再举一些例子

scala>  for (i<- 1 to 10) yield i
res2: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala>  for (i<- 1 to 10) yield i*2
res3: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)

scala> val array = Array(1, 2, 3, 4, 5,6,7,8,9,10)
array: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> for (e<-array) yield e
res4: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> for (e <- array if e > 5) yield e
res5: Array[Int] = Array(6, 7, 8, 9, 10)

当for循环截止后, 会重回全数 yield 的值组成的集聚。

再举二个例子,在/Users/tony/文件夹下存放了2个test文本文件。打字与印刷出该公文文件中含有Scala的整行内容。

/**
  * Created by tony on 2017/2/2.
  */
object YieldDemo {

  private val files = (new java.io.File("/Users/tony/")).listFiles

  private def fileLines(file: java.io.File) =
    scala.io.Source.fromFile(file).getLines.toList

  def main(args: Array[String]): Unit = {
    val lineLengths =
      for {
        file <- files
        if file.getName.endsWith("test")

        line <- fileLines(file)
        trimmedLine = line.trim
        if trimmedLine.matches(".*Scala.*")
      } yield line

    lineLengths.foreach(println)
  }
}

4. class 与 object的区别

Scala中从不静态修饰符static,在object下的分子全部都是静态的,倘使在类中扬言了与该类相同的名字的object则该object是此类的“伴生对象”,能够清楚把类中的static集中停放了object对象中,伴生对象和类公事必须是同二个源文件,能够用伴生对象做一些开端化的操作。那或多或少上
Scala 和 Kotlin 有个别看似。

并且object不可能提供构造器参数,也便是说object必须是无参的。

class的始末实在太大了,现在会单独写一篇笔记。

5. 类中getter/setter 方法

在Java中,平日将字段评释为个人的,然后添加公有的getter和setter方法来提供访问字段的接口。

可是,Scala 对种种字段都提供了getter和setter方法。
先看三个例子

/**
  * Created by tony on 2017/2/2.
  */
class User {

  var name:String = ""
}

object TestSetterAndGetter {

  def main(args:Array[String]): Unit = {

    val user = new User()
    println ("user.name="+user.name) // 调用方法user.name()

    user.name = "tony" // 调用方法user.name_=("tony")
    println ("user.name="+user.name)
  }
}

在上述例子中,User对象的getter和setter分别名叫name和name_=。

将那么些大概的User类编写翻译后,使用javap查看生成的字节码,能够作证这点。

 javap -private User.class

变动如下的Java代码

Compiled from "TestSetterAndGetter.scala"
public class com.safframework.test.User {
  private java.lang.String name;
  public java.lang.String name();
  public void name_$eq(java.lang.String); // =号被翻译成了$eq
  public com.safframework.test.User();
}

将上述例子元帅User对象name的var改成val会变成什么吧?编写翻译器会提醒出错。使用val申明的字段,是唯有getter,因为val申明的是不可变的。

val评释的字段不可能兑现setter.png

总结

Scala 的语法跟 Kotlin 颇有相似之处,小编是先读书了 Kotlin 再来学 Scala
的,所以对于 Scala
的语法毫无违和感。在那里,我收拾了var、val的差异,for循环的利用,以及类的基础知识。

下一篇,笔者或许会一连整治 Scala
的底蕴语法相关内容。要是笔者有写得不科学的地方,请一定要报告自个儿。

先前的稿子:
Scala学习笔记(一)

相关文章