Scala基础二

一、Object和Class的区别

1.1 存放的数据不同

  同名的Object和class互为半生关系。同名的object是class的半生对象,class是object的半生类。所以一个scala的文件存放同名的Object和Class,Object存放的内容就是像Java中的静态属性和静态方法,Class的是要new一个出来才能使用,所以Object是静态方法和属性的集合,class是一个对象的属性和方法的集合


object ApplyApp {
  println("Hello object enter")
  def sayHello: Unit ={
    println("object say Hello")
  }
  println("Hello object exit")
}

class ApplyApp{
  println("Hello class enter")
  def sayHello: Unit ={
    println("class say Hello")
  }
  println("Hello class exit")
}
ApplyApp.sayHello
结果
Hello object enter
Hello object exit
object say Hello

val a = new ApplyApp()
a.sayHello
结果
Hello class enter
Hello class exit
class say Hello
1.2 两个钟特殊的方法

  在Scala中有一个特殊的方法,这个方法名叫做apply

定义:
object ApplyApp {
  def apply: ApplyApp ={
    println("hi this is apply")
    new ApplyApp()
  } 
}
使用:
var a = ApplyApp()
输出:
hi this is apply

  所以结论就是,半生对象(object)没有new,就是调用半生对象中的apply方法。这个是半生对象object,如果是对象呢?

定义:
class ApplyApp{
  def apply() = {
    println("hi this is class apply")
  }
}
调用:
val a = new ApplyApp()
a()
输出:
hi this is class apply

  所以结论就是,半生对象(object)(),就是调用半生对象中的apply方法;如果是对象(),就是调用对象中的apply方法,当然不止(),里面可以带参数

二、数组(Array)

  数组和Java一样分为定长数组和变长数组。定长数组定义“val a = new Array[String](5)”;变长数组定义“**val a = new ArrayBufferInt **”

2.1 定长数组

  常用的定义方式其实不是正规的定义方式(上面定义这种),其实常用的是这种“val b= Array(“aaa”,“bbbb”)”,根据第一节的介绍,可见底层使用的是半生对象(object)的apply方法。
  如何取值呢,和Java中不太一样,使用:b(0) ="saf"
  常用的方法:
|方法|含义|使用|
|:-|||
|length|数组内元素的个数|b.length|
|max|数组内元素中最大的那个数|b.max|
|sum|数组内元素的和|b.sum|
|min|数组内元素中最小的哪个数|b.min|
|mkString|数组内元素转成一个字符串|b.mkString每个元素拼接在一个字符串
b.mkString(",")每个元素拼接在一个字符串并以",“分隔
b.mkString(”[",",","]")每个元素拼接在一个字符串并以","分隔,前后用“[”“]”|

2.1 变长数组

  变长数组就是说数组的容量是可以变化的。和定长一样,也不太常用new,所以推荐写法val a = ArrayBuffer[Int](),但是这个需要导入一个包,import scala.collection.mutable.ArraryBuffer
  如何向可变数组中添加数据:

a += 1
a += (2,3,4)
a ++= Array(5,6,7)   //变长加上定长用++=
a.insert(1, 0,0,0)  //向第2个位置中加入3个0 
a.remove(1,3)       //从第2个位置删除连续三个数
2.1 变长定长转变
import scala.collection.mutable.ArraryBuffer
val c = ArraryBuffer[Int]()
val b = c.toArrary  //这样就把变长变成定长

三、Case Class

  Case Class是可以不用new就可以生成对象的。

定义
case class Dog(name:String)
使用
plantln(Dog("wangwang").name)

  case class的使用场景:1、不用new 直接使用;2、模式匹配使用
  注意一下

定义:
object ApplyApp {
  def apply(age:String): Unit ={
   println("object")
  }
}
case class ApplyApp(name:String){
  def apply(age:String) = {
    println("hi this is class apply")
  }
}

调用:
println(ApplyApp("s").name)  报错,不识别name

  虽然case class不用new就可以使用对象,但是如果半生对象(object)中用对应形参的apply,优先匹配半生对象???

四、trait

  trait就把他看成Java中的接口,只有定义,没有具体实现。

trait logging{
   def name:String
}

object ApplyApp extends logging with Serializable {
}

  实现的方法:类实现trait第一使用extends,后面的使用with。

五、List集合

  Scala中有一个特殊的东西 => Nil,什么是Nil,Nil就是一个空的List。List也分为定长和变长,变长叫做ListBuffer,添加数据的方法和Array一样。变长的ListBuffer在包import scala.collection.mutable.ListBuffer中。

方法含义使用
head数组内第一个元素b.head
tail数组除了第一个元素的其他元素b.tail
::将::前后数据放置在一个list中,按照原顺序1 :: List(2,3)

六、Map

  创建方式:val a = Map(“key1”->“value”,“key2”->“value”),在键和值之间使用->方式成对。如何取值a(“key1”)。但是有个问题,这个是不可变得Map,a(“key1”)="hahaha"会报错(定长list和set一样,初始化好了就不能改变元素)。一般使用可变的Map,叫做HashMap。添加方式如List差不多。
  这种取值的方式有些问题,一旦没有该key,就会报错。常常使用
a.getOrElse(“a”,“100”)
,如果有键,就是该值,如果没键就是这个后面的默认值。

取值方式
1、for((key,value) <- a)
2、for(key <- a.keySet) {key +" " +a(key)}
3、for((key,_) <- a){ key +" " +a(key) }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值