澳门黄冠娱乐备用网址Scala 有些许种概念变量的办法。Scala 有三三两两种植概念变量的点子。

Scala是啊,能举行呀?

Scala是一致门户多范式的编程语言,一栽恍若java的编程语言
,设计初衷是实现而伸缩的言语、并集成面向对象编程和函数式编程的各种风味。

脚下,Scala 在国外比较火,Twitter 已经拿自己一切之代码从 Ruby
转到了Scala。而且还有 Spark、Kafka、akka 这样的开源项目及
Twitter、Linkedin 等企业大力支持,所以我好看好 Scala 这宗语言。

Scala是啊,能召开啊?

Scala是一模一样派别多范式的编程语言,一栽恍若java的编程语言
,设计初衷是贯彻可伸缩的言语、并集成面向对象编程和函数式编程的各种特色。

现阶段,Scala 在海外比较火,Twitter 已经以协调整个的代码从 Ruby
转至了Scala。而且还有 Spark、Kafka、akka 这样的开源项目以及
Twitter、Linkedin 等公司大力支持,所以自己非常看好 Scala 这门语言。

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,不可变对象与无副作用的艺术。

1. val 与 var

Scala 有一定量栽概念变量的方式:val和var。

当val定义好变量之后,无法再次改变量之值。类似于下了Java的final来修饰变量。

 scala> val param = "abel"param: String = tonyscala> param = "monica":12: error: reassignment to val param = "monica" ^

var定义的变量,可以数修改变量的价值

scala> var param = "tony"param: String = tonyscala> param = "monica"param: String = monicascala> println (param)monica

出一个建议,Scala 程序员崇尚以val,不可变对象及莫副作用的道。

2. 关于for循环

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.1 to关键字

跟Java不同,Scala 的for循环变得杀简单,直接用to关键词就是可以了

scala> for (i<- 1 to 10) { | println ("i is " + i) | }i is 1i is 2i is 3i is 4i is 5i is 6i is 7i is 8i is 9i 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.2 until关键词

也堪采取until关键词

scala> for (i<- 1 until 10) { | println("i is " + i) | }i is 1i is 2i is 3i is 4i is 5i is 6i is 7i is 8i 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.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条件语句一起使用

打印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之间用为此“;”来划分。

2.4 for循环和if条件语句一起利用

打印1及10,并且过滤出过5的数字

  scala> for (i<- 1 to 10if i>5) { | println(i) | }678910

面的代码,对于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/文件夹下存放了一个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)
  }
}

3. yield的用法

yield 会构造并返回跟给定集合相同档次的汇。yield需要配合for循环来使用。

先看yield的用法

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

再推一些事例

  scala> for (i<- 1 to 10) yield ires2: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)scala> for (i<- 1 to 10) yield i*2res3: 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 eres4: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)scala> for (e <- array if e > 5) yield eres5: Array[Int] = Array(6, 7, 8, 9, 10)

当for循环结束晚, 会返回所有 yield 的值组成的聚合。

还推一个例,在/Users/tony/文件夹下存放了一个test文本文件。打印出拖欠公文文件中含Scala的整行内容。

  /** * Created by tony on 2017/2/2\. */objectYieldDemo{ privateval files = (new java.io.File("/Users/tony/")).listFiles privatedeffileLines(file: java.io.File) = scala.io.Source.fromFile(file).getLines.toList defmain(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的情其实太可怜了,未来见面单独写一首笔记。

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

5. 类中getter/setter 方法

在Java中,通常以字段声明也个人的,然后上加公有的getter和setter方法来提供访问字段的接口。

但是,Scala 对每个字段都提供了getter和setter方法。

优先押一个例

  /** * Created by tony on 2017/2/2\. */classUser{ var name:String = ""}objectTestSetterAndGetter{ defmain(args:Array[String]): Unit = { val user = newUser() 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"publicclasscom.safframework.test.User{ private java.lang.String name; public java.lang.String name(); publicvoid name_$eq(java.lang.String); // =号被翻译成了$eqpublic com.safframework.test.User();}

拿上述例子中将User对象name的var改化val会变成什么啊?编译器会唤醒出错。使用val声明的字段,是不过出getter,因为val声明的凡不可变的。

总结

Scala 的语法跟 Kotlin 颇有相似之处,我是事先上了 Kotlin 再来拟 Scala
的,所以于 Scala
的语法毫无违和感谢。在这里,我整了var、val的区别,for循环的利用,以及近似的基础知识。

生一样首,我或者会连续整治 Scala
的底蕴语法相关内容。如果本身出描绘得无得法的地方,请一定要是告自己。

早先的章:
Scala学习笔记(一)

总结

Scala 的语法跟 Kotlin 颇有相似之处,我是先期修了 Kotlin 再来法 Scala
的,所以对于 Scala
的语法毫无违和感谢。在此处,我整了var、val的界别,for循环的施用,以及近似的基础知识。

相关文章