scala基礎語法-----Spark基礎

 注:最近在上網課,然後這學期開了一門spark,以下文字來自課堂發的資料,不知道發在這上面算不算侵權,主要是爲了自己複習方便,侵權刪。

然後我根據上課內容進行了一些練習,代碼在最下方。

scala基本語法

我們可以根據scala 菜鳥教程來學習

地址爲:

https://www.runoob.com/scala/scala-tutorial.htm

 

1.變量聲明

/**

      * 定義變量使用var或者val關 鍵 字

      

      * 語法:

      *  var | val 變量名稱(: 數據類型) =變量值  */

    // 使用val修飾的變量, 值不能爲修改,相當於java中final修飾的變量

val name = "tom"

name=”李四”  //錯誤

     // 使用var修飾的變量,值可以修改

var age = 18

age=40  //正確  ,可以修改

    // 定義變量時,可以指定數據類型,也可以不指定,不指定時編譯器會自動推測變量的數據類型

    val name2 : String = "jack"

 

 

 

2.變量聲明字符串的格式化輸出

valal name = "JackMa"
 val price = 998.88d
 val url = "www.baidu.com"
 // 普通輸出,注意這裏是可以使用逗號分隔的,但是在java中,我們是需要用“+”號拼接
 println("name=" + name,"price="+price,"url="+url)
 // 'f'插值器允許創建一個格式化的字符串,類似於C語言中的printf。
 // 在使用'f'插值器時,所有變量引用都應該是printf樣式格式說明符,如%d ,%i ,%f等 。
 // 這裏$name%s打印String變量name,
 println(f"姓名:$name%s,價格:$price%1.3f,網址:$url%s")
 println(f"姓名:$name,價格:$price,網址:$url")
 // 's'插值器允許在字符串中直接使用變量
 // 下列語句中將String型變量($name)插入到普通字符串中
 println(s"name=$name,price=$price,url=$url")
 //'s'插值器還可以處理任意形式的表達式
 val m=12;
 val n=33;
 println(s"m+n=${m+n}")
println(s"1+1=${1+1}") //output "1+1=2"

 

3.條件表達式

//if語句的使用
var faceValue=98
var res1=if (faceValue>90) "帥的一批" else "有點惱火"
println(res1)
//3>5 不成立,且代碼沒有else分支,那麼res2應該輸出什麼呢?
var i=3
var res2=if (i>5) i
println(res2)// output  ()代表空
// 支持嵌套,if...else if ...else代碼過多時可以使用{}
val score=85
var res3={if(score<60)"不及格"
else if(score>=60&&score<70)"及格"
else if (score>=80&&score<90)"優秀"
else "非常優秀"}
println(f"res3=$res3")

輸出

4.循環語句

//  定一個數組
var arr = Array(1, 2, 3, 4, 5, 6)
//遍歷數組中麼個元素
for (ele <- arr) {
  print(ele+" ")
} /*output:1 2 3 4 5 6*/
println("")
// 0 to 5 =>會生成一個範圍集合Range(0,1,2,3,4,5),左閉右閉
for (i <- 0 to 5) {
  print(i+" ") /*output:0,1,2,3,4,5*/
}
println("")
// 0 until 5 =>會生成一個範圍集合Range(0,1,2,3,4),左閉右開
for (i <- 0 until 5) {
  print(i+" ")/*output:0,1,2,3,4*/
}
println("")
// for循環中可以增加守衛,下面這段語句是打印arr數組中的偶數
for (i <- arr if i % 2 == 0) {
  print(i+" ")
} /*input:2,4,6*/
println("\n********************雙層for循環****************************")
//雙層for循環
for (i <- 1 to 3; j <- 1 to 3 if i != j) {
  print(i * 10 + j + "  ")
} /*output:12,13,21,23,31,32*/

for (i <- 1 to 3) {
  for(j <- 1 to 3 if i != j)
   {
     println(i * 10 + j + "")
   }
}

 

輸出:

1 2 3 4 5 6

0 1 2 3 4 5

0 1 2 3 4

2 4 6

********************雙層for循環****************************

12  13  21  23  31  32  12

13

21

23

31

32

 

********************yield 關鍵字將滿足條件的e的值又組合成一個數組****************************

2

4

6

 

4運算符和運算符重載

Scala 中的+-*/%等操作符的作用與 Java 一樣,位操作符 &|^>><<也一樣。

只是有 一點特別的:這些操作符實際上是方法。

例如:

a+b

是如下方法調用的簡寫:

a.+(b)

a 方法 b 可以寫成 a.方法(b)

例如

var a=4;
var b=5;
var c=a+b;
var d=a.+(b);
println(c)  //輸出是9
println(d)  //輸出是9

4方法的定義與調用

//方法聲明使用關鍵字def .
def f1(): Unit =
{
   //函數體
  println("我是方法體")
}
//方法名爲f1.  無參數, 返回值類型爲Unit,表示沒有返回值
def  f2(m:Int,n:Int):Int={
  return m+n;
  //或者直接寫m+n  不用帶關鍵字 return
}

//函數調用   和java相同

f1();
var m=f2(4,5);
println(m)

//方法體比較簡單的方法還可以如下聲明方式

def sayHello1 = print("Say BB1")
def sayHello2() = print("Say BB2")
sayHello1 // 如果方法沒有()調用時不能加()
sayHello2() // 可以省略( ) ,也可以不省略

 

4函數的定義與調用

函數聲明使用val關鍵字,類似聲明變量

val m1=  println("我是m1函數")
val m2:(Int,Int)=>Int=(x,y)=>{  x+y }
val m3:(Int,Int)=>Unit=(x,y)=>{  var z=x+y;println(z)}
val m4=(x:Int)=>{x+4;}

 

注意:

方法與函數的區別

  1. 聲明方式不同
  2. 函數可以作爲方法的參數

通過  Val  函數=方法 _   把方法轉爲函數

 

//聲明一個參數爲函數的方法, 第一個參數是函數名,第二個參數是參數

Func:Int=>Int   前面的Int表示函數的參數Int類型, 後面的Int表示函數的返回值是Int類型
def cal(func:Int=>Int,x: Int): Unit ={
   var r= func(x);
   println(r)
}

func:Int參數名稱和類型,Int,x: Int 返回值類型和返回值參數

例如:如下方法可以作爲cal方法的參數

def f1(x:Int): Int ={
  x+10;
}

調用cal方法 .注意這裏的f1是方法,可以直接作爲函數的參數,

系統默認f1轉爲函數。

cal(f1,4);

也可以使用這樣, 先轉爲函數,後傳值。

val f1_m=f1 _;
cal(f1_m,4);

5可變參數

格式. 注意後面的*  ,  params是任意的一個變量。在函數內部就是一個數組了。可以接受多個參數。

//說白了,可變參數就是使用一個數組取接收值

 

def m2(params: Int *): Unit ={
   for(x<-params){
     println(x)
   }
}

 

 

練習代碼:

object C1 {
  def main(args: Array[String]): Unit = {
//    1、基礎變量
     val name="zhh"
    //name="zzz" //錯誤 val不能修改
    var name3="zhh" //var可修改
    name3="zzz"
    val name2:String="jack"
//    2、變量聲明字符串的格式化輸出
    val age=18
    val address="desfsff"
    println("name1="+name,"age1="+age,"address="+address)
    println(f"name2=$name%s,age2=$age%s,address=$address%s")
    println(f"name3=$name ,age3=$age,address=$address%s")
    println(s"name4=$name ,age4=$age,address=$address")
    var m=100
    var n=3
    println(s"m/n=${m/n}")
    println(s"m/n=${m*1.0/n}")

    var i=3
    var res=if (i>5) i
//3、循環遍歷
    var a1=Array(1,2,3,4,5,6);
    for(v <- a1) //<-循環遍歷a1 將每次遍歷的值賦值給v
      {
        print(v+" ")
      }
    println()
    a1.foreach(v => print(v+" "))   //v相當於函數參數,print(v+" ")相當於函數體 (相當於匿名函數,,,整體類似於函數function(v){})
    println()

    for(i <- 1 to 3)
      {
        print(i+" ")
      }
    println()

     //    輸出數組a1的內容
    for(i <- 0 to a1.length-1)
    {
      print(a1(i)+" ") //用a1(i)表示數組元素
    }
    println()

    for(i <- a1 if i%2 ==0 )
    {
      print(i+" ") //if i%2 ==0 限制輸出條件
    }
    println()

    //雙層for循環
    for (i <- 1 to 3; j <- 1 to 3 if i != j) {
      print(i * 10 + j + " ")
    } /*output:12,13,21,23,31,32*/
    println()
//     與上面循環等價
    for (i <- 1 to 3) {
      for(j <- 1 to 3 if i != j)
      {
        print(i * 10 + j + " ")
      }
    }
    println()
//4、方法
    var c2=new C2(); //實例對象
    c2.f1();
// 5、函數
    //此處爲main函數中內容
    println("我是main函數的內容")
    f2();
    m3(3,4)  //帶參數的函數需要調用(一般不這樣用)

   //......(1)顯式轉換
    val f3_hanshu=f3 _;  //顯式轉換 方法f3轉換爲函數
    cal(f3_hanshu,20);
    //.....顯式轉換結束

    //....(2)隱式轉換
    cal(f3,20);  //20作爲f3的參數傳給方法f3
//    調用cal方法 .注意這裏的f1是方法,可以直接作爲函數的參數,
//    系統默認f1轉爲函數。
//.....隱式轉換結束


    //(3)可變參數
   m2(canshu  =1,3,4,5,2,5);




  }

//顯式轉換,隱式轉換。。。。。。。
  def f3(m:Int): Int ={  //f3作爲參數傳給方法cal,即f3爲參數fun1,
    return m+10;
  }

  def cal (fun1: Int=>Int,m:Int) : Unit ={  //func:Int參數名稱和類型,Int,x: Int 返回值類型和返回值參數
    var t=fun1(m);
    println(t)
  }
  //顯式轉換結束,隱式轉換結束。。。。。


  //可變參數..............
  def m2(canshu : Int *): Unit ={
    for(x<-canshu ){
      print(x+" ")
    }
    println()
  }
  //說白了,可變參數就是使用一個數組取接收值,func此時相當於一個數組
  ////可變參數結束..............

  // 5、函數
  //程序會先執行hashu,和hanshu2(val 一個函數相當於已經實例化類似於是個變量) 後執行main函數!!!!!

  def f2(): Unit ={
    println("我是方法f2")
  }

  def f1(x:Int,y:Int): Int ={
    return x+y;
  }

  val hanshu=println("我是函數hanshu")
  val hanshu2={println("我是函數hanshu2222")}
  val m3:(Int,Int)=>Int=(x,y)=>{  //帶參函數
    println("dsfdfsfsff")
    x+y
  } //m3是函數名稱,(Int,Int)函數的參數類型,Int是返回值類型 (x,y)返回值參數,{  x+y }爲返回值

}
package com.zhh

class C2 {
  //   4、方法聲明
  def f1(): Unit ={
    println("我是C2.f1")
    var t=f2(n1=3,n2=4) //調用方法f2
    println(t)

  }

  def f2(n1:Int,n2:Int): Int ={
//    不能改變n1的值,可用用另一個變量賦予n1的值
    var m=n1;
    m=222;
    return n1+n2
  }


}

 

結果爲:

我是函數hanshu
我是函數hanshu2222
(name1=zhh,age1=18,address=desfsff)
name2=zhh,age2=18,address=desfsff
name3=zhh ,age3=18,address=desfsff
name4=zhh ,age4=18,address=desfsff
m/n=33
m/n=33.333333333333336
1 2 3 4 5 6 
1 2 3 4 5 6 
1 2 3 
1 2 3 4 5 6 
2 4 6 
12 13 21 23 31 32 
12 13 21 23 31 32 
我是C2.f1
7
我是main函數的內容
我是方法f2
dsfdfsfsff
30
30
1 3 4 5 2 5 

Process finished with exit code 0

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章