Scala的相关知识(一)

 Scala:  scala是一种编译性语言,其底层也是基于java虚拟机来的。也就是jvm的一门编程语言,所有scala代码,都需要编译为字节码,然后交由java虚拟机来运行。所以Scala和Java是可以无缝互操作的, Scala可以任意调用Java代码。

 -- scala解释器的使用:

    REPL:Read(取值) -> Evaluation(取值)->Print(打印)->Loop(循环),Scala解释器也被称为REPL,会快速编译scala代码为字节码,然后交给jvm执行。

-- 计算表达式  : 在scala> 命令行内,键入scala代码,解释器会直接返回结果给你,如果没有指定变量来存放这个值,那么默认的名称为res ,而且会显示结果的数据类型,比如int,Double,String .   eg:

 Scala的相关知识(一)

-- 内存变量:在后面可以继续使用res这个变量,以及它存放的值。 eg:

 Scala的相关知识(一)

-- 自动补全 :   在scala命令行,可以使用tab键进行自动补全。

 Scala的相关知识(一)   敲击 re ,按tab键,就会弹出待选项 。

--  val变量: 可以声明val变量(常量)来存放表达式的计算结果。并且,后续这些常量可以继续使用的,但是常量声明之后,无法改变其值。 eg:

 Scala的相关知识(一)

-- var变量: 如果要声明 值可以改变的引用,可以使用var变量。 但是在scala程序中,建议使用val,也就是常量,因为在spark的大型复杂系统中,需要传输大量的网络数据,如果使用var,可能会造成值 被错误的修改的情况

-- 指定类型:无论声明val变量,还是var变量,都可以手动指定其类型,如果不指定的话,scala会自动根据值,进行类型的推断。

-- 声明多个变量 : 可以将多个变量放在一起声明。 eg:

Scala的相关知识(一)

 -- 基本数据类型:Byte,Char,Short,Int,Long,Float,Double,Boolean 乍一看与java的基本数据类型的包装类型相同,但是scala没有基本数据类型与包装类型的概念,统一都是类。scala自己负责基本数据类型和引用类型的转换动作。

-- 类型的加强版类型:scala使用很多加强类给数据类型增加了上百种增强的功能或函数。eg. 通过StringOps类增加了大量的函数  Scala的相关知识(一)      Scala还提供了RichInt ,RichDouble,RichChar等类型。

--基本操作符: scala的算术操作符与java的算数操作符没什么区别,但是在scala中,这些操作符其实就是数据类型的函数,比如1+1 ,可以写作1+ (1)  例如 1.to(10),又可以写作  1 to 10  ,scala中没有提供++ ,--操作符,只能使用+=和=,比如counter=1,counter++

-- 函数调用方式 : 在scala中,函数调用也很简单。eg  import scala.math_ ,sqrt(2) ,pow(2,4) min(3,Pi) 。 不同一点的是,如果调用函数时,不需要传递参数,则scala允许调用函数时省略括号,例如 : "Hello World" .distinct

 -- apply函数:  scala中的apply函数时一种非常特殊的函数,在scala的object中,可以声明apply函数,而使用“类名()”的形式,其实就是"类名.apply()"的一种缩写。通常使用这种方式来构造类的对象,而不是使用"new 类名()"的方式。eg :

 Scala的相关知识(一)

Scala的相关知识(一)

-- if表达式的定义  :  在Scala中 if表达式是有值得,就是if或者else中最后一行语句返回的值。 也可以将if表达式赋予一个变量。Scala的相关知识(一)

--  if表达式的类型推断: if表达式是有值的了,而if和else子句的值类型可能不同,此时if表达式的值 是什么类型呢?  Scala会自动及性能推断,取两个类型的公共父类型。
    eg if(age >18) 1 else 0 表达式的类型为Int ,因为 1和0都是Int
    eg if(age >18) "adult" else 0 此时if和else的值分别是String和Int,则表达式的值是Any  Any是String和Int的公共父类型 。
   如果 if后面没有跟else,则默认else的值是Unit,也用()表示,类似于java中的void或者null

  eg val age=12;if(age >18) "adult" ,此时就相当于if(age >18)"adult" else ()

--  将if语句放在多行中 :默认情况下,REPL只能解释一行语句,但是if表达式通常需要放在多行。 可以使用{} 的方式,比如以下方式,或者使用:paste和ctrl+D的方式。 使用:paste 进入粘贴模式,然后输入代码,ctrl+D结束输入并执行。

Scala的相关知识(一)

--  默认情况下,scala不需要语句终结符,默认将每一行作为一个语句。 一行放多个语句:如果一行要放多个语句,则需要使用语句终结符。
  eg 使用分号,作为语句终结符,var a,b,c=0;if(a<1){b=b+1;c=c+1}   通常来说,对于多行语句,还是会使用花括号的形式。    :paste 进入粘贴模式   
  if(a<1){  
     b=b+1
    c=c+1

   }

 -- 块表达式: 块表达式,指的就是{}中的值,其中可以包含多条语句,最后一条语句的值就是块表达式的返回值

   eg  val d=if(a<1){b=b+1;c=c+1;b+c}   ,假设 a,b,c初始值为0 ,那么  d: AnyVal = 2

-- print 和println :print打印时不会加换行符,而println打印时,会加一个换行符。
    printf  : 可以用以进行格式化 。  eg printf("Hi,my name is %s ,I'm %d years old. \n","Leo",30)
    readLine :readLine 允许我们从控制台读取用户输入的数据,类似于java中的System.in 和Scanner的作用

-- while do循环 :Scala有while do循环 ,基本语义与java相同。
     var n=10   :paste 进入粘贴模式   
while(n>){
   println(n)
   n-=1

}

-- Scala中没有for循环,只能使用while替代for循环,或者使用简易for循环。

     简易版for语句: var n=10; for(i <- 1 to n)println(i) 或者 使用until ,表达式不达到上限,for(i <- 1 until n )print(i+ " ") 也可以对字符串进行遍历,类似于java中的增强型的for循环    eg .  for(i <- "Hello world") print (i +" ") 

Scala的相关知识(一)

 -- 跳出循环语句
     Scala中没有提供类似于java的break语句。但是可以使用boolean类型变量,return或者Breaks的break函数来替代使用。
  eg    import scala.util.control.Breaks._     :paste进入粘贴模式
  breakable {
var n =10
for(c <- "Hello World"){
if(n ==5) break;
print(c +" ")
n-=1
}

  }

Scala的相关知识(一)

-- 多重循环 : 九九乘法表

Scala的相关知识(一)

 -- if守卫 : 取偶数 
    for(i<- 1 to 100 if i%10 ==0) print(i+ " ")
  -- for推导式 :构造集合

   for(i <- 10) yield i  

  Scala的相关知识(一)