Scala之变量与函数

Scala 官网:http://www.scala-lang.org/


一、数据类型


二、变量

/*
 * 变量的定义
 * 语法:
 * 关键字(val / var) 变量名:数据类型(首字母大写):值
 * 特点:
 * ⑴Scala是强类型语言,必须定义类型;
 * ⑵Scala中没有基本数据类型和包装类之分,所有的数据类型都是类,类型首字母需要大写;
 * ⑶声明变量时可以不指定变量类型,Scala会帮我们进行变量类型推断;
 * ⑷当val修饰的变量被lazy修饰时,则该变量的初始化将被推迟,直到第一次使用时才会去初始化,
 * 如:lazy val a = 11.2
 */
//使用val声明一个不可变变量
val a:Int = 1  //再次赋值a=2  报错:error:reassignment to val

//使用var声明一个可变变量
var b = 2

//声明一个空值的变量
var name:String = ""   //赋值一个空串
var name1:String = _   //使用占位符'_'


三、函数

1、函数定义的语法

def  函数名称 (参数名称:参数类型) :函数返回值类型 = { 

函数体内容

}



/*
 * Scala函数的定义
 * 语法:
 * def 函数名称(参数名称:参数类型):函数返回值类型 = { 函数体内容 }
 * 特点:
 * ⑴Scala可以自动推断数据类型,所以函数的返回值类型一般可以省略;
 * ⑵Scala中函数的默认返回值为Unit;
 * ⑶Scala中函数为空参时,可以直接使用函数名调用,小括号可以省略;
 */
//函数的定义
def fun1(x:Int, y:Int) : Int = { x+y }
fun1(1,2)

//定义返回值缺省的函数
def fun2(x:Int, y:Int) = { x+y }
fun2(2,3)

//定义空参函数
def fun3() = { println("hello world!")}
fun3()
fun3

//函数中定义另一个函数,内函数可以调用外函数的变量
def fun4(a:Int) = {
  def fun5(b:Int) = {
    println("a+b=" + (a+b))
  }
  fun5(500)
}

fun4(20)


2、匿名函数的定义

/*
 * 匿名函数的定义
 * 语法:
 * (变量1:数据类型,...变量2:数据类型)=> { 函数体内容 }
 * 特点:
 * ⑴匿名函数可以赋值给一个函数;
 * ⑵匿名函数可以赋值给一个变量;
 */
//匿名函数赋值给一个函数
def add1 = (x:Int, y:Int) => { x+y }
add1(1,2)

//匿名函数赋值给一个变量
val add2 = (x:Int, y:Int) => { x+y }
add2(1,2)

//将一个非匿名函数赋值给一个变量
def add3(x:Int, y:Int) = { x+y }
val add4 = add3 _    //函数名+空格+占位符
add4(1,2)


/*
 * 指定参数默认值的函数定义
 */
def loadConf(conf:String="spark-default.xml") = {
  println("conf is " + conf)
}
loadConf()
loadConf("file.xml")


3、变长参数的函数定义

/*
 * 变长参数的函数定义
 * Scala在定义函数时允许指定最后一个参数可以重复(变长参数),
 * 从而允许函数调用者使用变长参数列表来调用该函数;
 * Scala中使用"*"来致命该参数为重复参数;
 *
 * 在函数内部,变长参数的类型,实际为一维数组,比如上例的String*类型实际为Array[String]。
 * 然而,如果你试图直接传入一个数组类型的参数给这个参数,编译器会报错,如
 * val arr = Array("Hadoop","Hive","Hbase","Spark")
 * printCourses(arr)
 * 为了避免这种情况,我们可以通过在变量后面添加"_*"来解决,
 * 这个符号告诉Scala编译器在传递参数时逐个传入数组的每个元素,而不是数组整体。
 * printCourses(arr: _*)
 */
def printCourses(c:String*) = {
  c.foreach(x => println(x))
}
printCourses("Hadoop","Hive","Hbase","Spark")

val arr = Array("Hadoop","Hive","Hbase","Spark")
printCourses(arr: _*)


三、结构

1、循环表达式

/*
 * Range是左闭右开区间:[)
 * until是左闭右开区间:[)
 * to是左闭右闭区间:[]
 */
1 to 5
1.to(5)
1 to(5)

1 until 5
1.until(5)
1 until(5)

Range(1,5)
Range(1,5,2)   //可以指定步长
//Range(1,5,0) 步长不能为0,报错
Range(1,-5,-2)
Range(5,1,-1)


2、for循环

/*
 * for循环;
 * "<-"是一个提取符,可以从集合中遍历提取出所有元素;
 */
for (i <- 1 to 5) {
  println(i)
}

for (i <- 1.to(5)) {
  println(i)
}

for (i <- 1 until 5) {
  println(i)
}

//求1-10的偶数
for (i <- 1 to 10 if i % 2 == 0) {
  println(i)
}


3、break

import scala.util.control.Breaks
object LoopTest{
  def main(args: Array[String]) {
    val list = List("Hadoop","Hive","Scala")
    val loop = new Breaks
    loop.breakable{
      for (x <- list) {
        println(x)
        if (x == "Scala")
          loop.break()
      }
    }
    println("loop over!")
  }
}

4、元组tuple

/*
 * tuple 元组
 * 语法:
 * val tuple = (变量1,...,变量22)
 * 特点:
 * ⑴元组的类型时Scala和Python中特有的;
 * ⑵在Scala中,元组是n个不同数据类型对象的一个聚合,n的最大值是22;
 * ⑶Map的元素实际上是n=2的元组,即2元组,也是最简单的元组;
 */
//元组的遍历
val tuple = (1,2,"Scala",1)
for (x <- 0 until tuple.productArity) {
  println(tuple.productElement(x))
}


5、数组

/*
 * 数组是存储相同类型的元素的固定大小的连续集合;
 * 数组的第一个元素的索引是数字0,最后一个元素的索引是元素的总数减去1;
 * Scala中数组的类型:
 * 定长数组
 * 变长数组(scala.collection.mutable.ArrayBuffer)
 */
//定长数组(长度不可变):数组采用()访问,而不是[],下表从0开始
val a = new Array[String](3) //Array[String] = Array(null,null,null)
a.length  //Int = 3

//不用new,直接将值写在数组中,底层调用的是Object Array的apply方法
val b = Array("aa","bb","cc")
b(1)  //String = bb
// b(3) 报错:java.lang.ArrayIndexOutOfBoundsException:3

//变长数组
val c = scala.collection.mutable.ArrayBuffer[Int]()

//+=/++=/-=/--=/insert/remove/toArray/sum/max/reverse
c += 1
c += 2
c += (3,4)

//++可以放置一个Array进去
c ++= Array(5,6,7,8)

//在指定的位置插入指定的数据
c.insert(0,0)
c


//删除指定位置的数据
c.remove(1)
c

//从第0个开始删除3个
c.remove(0,3)

//变成定长数组
c.toArray
c.toArray.sum
c.toArray.min

//移除最后的两个
c.trimEnd(2)
c

for (i <- 0 until c.length) println(i)
for (ele <- c) println(ele)

//排序
//scala.util.Sorting.quickSort(c)

//将数组转换成字符串
c.mkString(",")
c.mkString("[",",","]")




//数组的遍历
val arr=Array(1,2,3,4)
for (x <- 0 until arr.length) {
  println(arr(x))
}

for (x <- arr) {
  println(x)
}

//排序
val arr1 = scala.collection.mutable.ArrayBuffer(1,2,3,4)
val arr2 = arr1.toArray
scala.util.Sorting.quickSort(arr2)
arr2
arr1.sorted  //默认是升序排序




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值