scala入门笔记(二)

Scala是什么,能做什么?

Scala是一门多范式的编程语言,一种类似java的编程语言 ,设计初衷是实现可伸缩的语言、并集成面向对象编程和函数式编程的各种特性。

目前,Scala 在国外比较火,Twitter 已经将自己全部的代码从 Ruby 转到了Scala。而且还有 Spark、Kafka、akka 这样的开源项目及 Twitter、Linkedin 等公司大力支持,所以本人很看好 Scala 这门语言。

Scala的基础语法

我整理了自己学习过程中感到有必要记录的东西,以防忘记

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.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 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.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 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的内容实在太大了,未来会单独写一篇笔记。

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循环的使用,以及类的基础知识。

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

推荐阅读更多精彩内容

  • Scala与Java的关系 Scala与Java的关系是非常紧密的!! 因为Scala是基于Java虚拟机,也就是...
    灯火gg阅读 3,427评论 1 24
  • scala文档 包含内容 1基础 2控制结构和函数 3数组相关操作 4映射和元组 5类 6对象 7.包和引入(x)...
    zlcook阅读 1,000评论 0 3
  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,175评论 9 118
  • Scala是什么,能做什么? Scala是一门多范式的编程语言,一种类似java的编程语言 ,设计初衷是实现可伸缩...
    fengzhizi715阅读 3,399评论 0 5
  • 1.那个似火烧的午夏,我正趴在课桌上昏昏欲睡,被同桌的一声狮吼给激醒。拉我出去悄悄地告诉我,那个看起来酷酷的男孩,...
    _Dtath阅读 295评论 0 2