[关闭]
@zhangyy 2017-09-30T16:33:50.000000Z 字数 3535 阅读 156

scala 基础语言

spark的部分


  • 一:scala与java的联系
  • 二:基础语言
  • 三:条件控制
  • 四:循环应用
  • 五:函数

一:scala与java的联系

  1. ScalaJava的关系是非常紧密的!!
  2. 因为Scala是基于Java虚拟机,也就是JVM的一门编程语言。所有Scala的代码,都需要经过编译为字节码,然后交由Java虚拟机来运行。
  3. 所以ScalaJava是可以无缝互操作的。Scala可以任意调用Java的代码。所以ScalaJava的关系是非常非常紧密的。
  4. ·从Scala官方网站下载,http://www.scala-lang.org/download/,windows版本的安装包是scala-2.11.7.msi。
  5. ·使用下载下来的安装包安装Scala
  6. ·在PATH环境变量中,配置$SCALA_HOME/bin目录。
  7. ·在windows命令行内即可直接键入scala,打开scala命令行,进行scala编程。

  1. ·REPLRead(取值)-> Evaluation(求值)-> Print(打印)-> Loop(循环)。scala解释器也被称为REPL,会快速编译scala代码为字节码,然后交给JVM来执行。
  2. ·计算表达式:在scala>命令行内,键入scala代码,解释器会直接返回结果给你。如果你没有指定变量来存放这个值,那么值默认的名称为res,而且会显示结果的数据类型,比如IntDoubleString等等。
  3. ·例如,输入1 + 1,会看到res0: Int = 2
  4. ·内置变量:在后面可以继续使用res这个变量,以及它存放的值。
  5. ·例如,2.0 * res0,返回res1: Double = 4.0
  6. ·例如,"Hi, " + res0,返回res2: String = Hi, 2
  7. ·自动补全:在scala>命令行内,可以使用Tab键进行自动补全。
  8. ·例如,输入res2.to,敲击Tab键,解释器会显示出以下选项,toCharArraytoLowerCasetoStringtoUpperCase。因为此时无法判定你需要补全的是哪一个,因此会提供给你所有的选项。
  9. ·例如,输入res2.toU,敲击Tab键,直接会给你补全为res2.toUpperCase

image_1b8jjbrjt1u94erea1t24g67i1t.png-6.4kB
image_1b8jjd7m3o1k1t4eng1t9pip22a.png-9.1kB

image_1b8jjege618at1ov3s2s1bhp1luk2n.png-9.5kB

二: 基础语言

  1. 声明val变量:可以声明val变量来存放表达式的计算结果。
  2. ·例如,val result = 1 + 1
  3. ·后续这些常量是可以继续使用的,例如,2 * result
  4. ·但是常量声明后,是无法改变它的值的,例如,result = 1,会返回error: reassignment to val的错误信息。
  5. ·声明var变量:如果要声明值可以改变的引用,可以使用var变量。
  6. ·例如,val myresult = 1myresult = 2
  7. ·但是在scala程序中,通常建议使用val,也就是常量,因此比如类似于spark的大型复杂系统中,需要大量的网络传输数据,如果使用var,可能会担心值被错误的更改。
  8. ·在Java的大型复杂系统的设计和开发中,也使用了类似的特性,我们通常会将传递给其他模块 / 组件 / 服务的对象,设计成不可变类(Immutable Class)。在里面也会使用java的常量定义,比如final,阻止变量的值被改变。从而提高系统的健壮性(robust,鲁棒性),和安全性。
  9. ·指定类型:无论声明val变量,还是声明var变量,都可以手动指定其类型,如果不指定的话,scala会自动根据值,进行类型的推断。
  10. ·例如,var name: String = null
  11. ·例如,var name: Any = "leo"
  12. ·声明多个变量:可以将多个变量放在一起进行声明。
  13. ·例如,var name1, name2:String = null
  14. ·例如,var num1, num2 = 100

image_1b8jj990b1fspm2n1t0n12kt1g4t13.png-8.6kB
image_1b8jja0uv1gf873b1baicrr1s481g.png-8.6kB
image_1b8jjg92a53k16357o68k18fm34.png-13.5kB
image_1b8jjkdve18cc1dr81cce15v7180r3h.png-24.9kB


  1. ·基本数据类型:ByteCharShortIntLongFloatDoubleBoolean
  2. ·乍一看与Java的基本数据类型的包装类型相同,但是scala没有基本数据类型与包装类型的概念,统一都是类。scala自己会负责基本数据类型和引用类型的转换操作。
  3. ·使用以上类型,直接就可以调用大量的函数,例如,1.toString(),1.to(10)。
  4. ·类型的加强版类型:scala使用很多加强类给数据类型增加了上百种增强的功能或函数。
  5. ·例如,String类通过StringOps类增强了大量的函数,"Hello".intersect(" World")。
  6. ·例如,Scala还提供了RichIntRichDoubleRichChar等类型,RichInt就提供了to函数,1.to(10),此处Int先隐式转换为RichInt,然后再调用其to函数
  7. ·基本操作符:scala的算术操作符与java的算术操作符也没有什么区别,比如+、-、*、/、%等,以及&、|、^、>>、<<等。
  8. ·但是,在scala中,这些操作符其实是数据类型的函数,比如1 + 1,可以写做1.+(1)
  9. ·例如,1.to(10),又可以写做1 to 10
  10. ·scala中没有提供++、--操作符,我们只能使用+和-,比如counter = 1counter++是错误的,必须写做counter += 1.

image_1b8jjtmdooljvr218q216uko3f4b.png-9.6kB
image_1b8jjue6hf8j14n81pna18r31j3u4o.png-17.1kB

image_1b8jk9a4abs5bpt1q992t3vm55.png-57.5kB

  1. ·函数调用方式:在scala中,函数调用也很简单。
  2. ·例如,import scala.math._sqrt(2),pow(2, 4),min(3, Pi)。
  3. ·不同的一点是,如果调用函数时,不需要传递参数,则scala允许调用函数时省略括号的,例如,"Hello World".distinct
  4. ·apply函数
  5. ·Scala中的apply函数是非常特殊的一种函数,在Scalaobject中,可以声明apply函数。而使用“类名()”的形式,其实就是“类名.apply()”的一种缩写。通常使用这种方式来构造类的对象,而不是使用“new 类名()”的方式。
  6. ·例如,"Hello World"(6),因为在StringOps类中有def apply(n: Int): Char的函数定义,所以"Hello World"(6),实际上是"Hello World".apply(6)的缩写。
  7. ·例如,Array(1, 2, 3, 4),实际上是用Array objectapply()函数来创建Array类的实例,也就是一个数组。

image_1b8jki6fe7p61i0fnrh7sofci5i.png-9.9kB
image_1b8jkil2715arheu1ojq1gi1hgb5v.png-37kB
image_1b8jko4hen2v1f6njhopjihk16c.png-11.1kB
image_1b8jktl0i16gk1tdhq6vjban366p.png-12kB
image_1b8jkvfcmom4bvrmo61je61rkb76.png-12.4kB


三:条件与循环

  1. ·if表达式的定义:在Scala中,if表达式是有值的,就是if或者else中最后一行语句返回的值。
  2. ·例如,val age = 30; if (age > 18) 1 else 0
  3. ·可以将if表达式赋予一个变量,例如,val isAdult = if (age > 18) 1 else 0
  4. ·另外一种写法,var isAdult = -1; if(age > 18) isAdult = 1 else isAdult = 0,但是通常使用上一种写法
  5. ·if表达式的类型推断:由于if表达式是有值的,而ifelse子句的值类型可能不同,此时if表达式的值是什么类型呢?Scala会自动进行推断,取两个类型的公共父类型。
  6. ·例如,if(age > 18) 1 else 0,表达式的类型是Int,因为10都是Int
  7. ·例如,if(age > 18) "adult" else 0,此时ifelse的值分别是StringInt,则表达式的值是AnyAnyStringInt的公共父类型
  8. ·如果if后面没有跟else,则默认else的值是Unit,也用()表示,类似于java中的void或者null。例如,val age = 12; if(age > 18) "adult"。此时就相当于if(age > 18) "adult" else ()。
  9. ·将if语句放在多行中:默认情况下,REPL只能解释一行语句,但是if表达式通常需要放在多行。
  10. ·可以使用{}的方式,比如以下方式,或者使用:pastectrl+D的方式。
  11. if(age > 18) { "adult"
  12. } else if(age > 12) "teenager" else "children"

image_1b8jlco1k1hu713uvi9mo6818417j.png-21.6kB

  1. ·默认情况下,scala不需要语句终结符,默认将每一行作为一个语句
  2. ·一行放多条语句:如果一行要放多条语句,则必须使用语句终结符
  3. ·例如,使用分号作为语句终结符,var a, b, c = 0; if(a < 10) { b = b + 1; c = c + 1 }
  4. ·通常来说,对于多行语句,还是会使用花括号的方式
  5. if(a < 10) {
  6. b = b + 1
  7. c = c + 1
  8. }
  9. ·块表达式:块表达式,指的就是{}中的值,其中可以包含多条语句,最后一个语句的值就是块表达式的返回值。
  10. ·例如,var d = if(a < 10) { b = b + 1; c + 1 }

image_1b8rli72s1ju61e29197k4fp1v2v9.png-34.3kB


添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注