Scala集合

Array:
  定长数组
  变长数组
  +=/++=/insert

定长数组:
object ArrayApp extends App{

  val a = new Array[string](5)
  a.length //查看数组长度
  a(1) = "hello" //赋值,下标从0开始

  val b = Array("hadoop","spark", "storm") //直接赋值
  b(1) = "flink" //修改值

  val c = Array(2,3,4,5,6,7,8,9)
  c.sum
  c.min
  c.max
  c.mkString
  c.mkString(",")
  c.mkString(" and ")
}

 

变长数组:

val d = scala.collection.mutable.ArrayBuffer[Int] ()

d += 1
d += 2
d += (3,4,5)
d ++= Array(6,7,8)
d.insert(0,0) //在第0个位置插入数值0
d.remove(1) //删除下标1的数值
d.remove(0,3) //删除下标0到3的数值
d.trimEnd(2) //从尾部开始删除

d.toArray //把可变的转成不可变的。

println(d)


//取集合
for(i <- 0 until d.length) {
  println(d(i))
}

for(ele <- d) {
  println(ele)
}


取反的集合
for(i <- (0 until d.length).reverse) {
  println(d(i))
}


List:

Nil 就是一个不可变的list(),可以当做一个空的集合。

scala> Nil
res0: scala.collection.immutable.Nil.type = List()   //不可变的List()

object ListApp extends App{
  val l = List(1,2,3,4,5)
}

一个list就是由head和tail组合的。
scala> l.head //head就是第一个元素
res1: Int = 1

scala> l.tail //tail就是剩下的元素
res2: List[Int] = List(2,3,4,5)

scala> val l2 = 1 :: Nil //:: 就是把1当成head,把后面当成tail拼成一个list。
l2: List[Int] = List(1)

scala> val l3 = 2 :: l2
l2: List[Int] = List(2,1)

scala> val l4 = 1 :: 2 :: 3 :: Nil
l4: List[Int] = List(1,2,3)

val l5 = scala.collection.mutable.ListBuffer[Int] () //变长List

l5 += 2
l5 += (3,4,5)
l5 ++= List(7,8,9)

l5 -= 2
l5 -= 3
l5 -= (1,4) //不会报错,有就减掉没有就算了。
l5 --= List(7,8,9)

l5.toList //转成定长的

l5.toArray //转成Array
l5.isEmpty //是否为空
l5.tail.head

def sum(nums:Int*):Int = {
  if(nums.length == 0) {
    0
  } else {
    nums.head + sum(nums.tail:_*)   //:_* 转成可变参数,其实就是个递归。
  }
}

println(sum())
println(sum(1,2,3,4))


Set:

scala> val set = Set(1,2,2,1,4,3)
set : scala.collection.immutable.Set[Int] = Set(1,2,4,3) //去掉重复的数据了。

Map:

import scala.collection.mutable
import scala.collection.mutable._
object MapApp extends App{

  val a = Map("PK" -> 18, "zhangsan" -> 30) //不可变的

  val b = scala.collection.mutable.Map("PK" -> 18, "zhangsan" -> 30) //可变的

  val c = mutable.HashMap[String,Int] ()

  b.getOrElse("PK",9) //得到就得到了,没得到的话就放一个默认值进去。

  b("list") = 40 //添加一个参数
  b += ("wangwu" ->4, "zhaoliu" ->5)
  b -= "wangwu"

  遍历:
  第一种方式:
  for((key,value) <- b) {
    println(key + " : " + value)
  }

  第二种方式:
  for(key <- b.keySet) {
    println(key + " : " + b.getOrElse(key, 9))
  }

  直接取value
  for(value <- b.values) {
    println(value)
  }

  for((key,_) <- b) {
    println(key + " : " + b.getOrElse(key, 9))
  }
}

  Array/List/Map 不可变
  ArrayBuffer/ListBuffer/ 可变

Option&Some&None之间的关系:

scala> b.get("PK")
res17: Option[Int] = Some(16) //类型是Option的

scala> b.get("PK1")
res17: Option[Int] = None


Some的源码:
final case class Some[+A] (x: A) extends Option[A] {
  def isEmpty = false //如果是Some就不为空,把KEY get取出来就行。
  def get = x
}


None的源码:
  case object None extends Option[Nothing] {
  def isEmpty = true //如果是None就为空
  def get = throw new NoSuchElementException("None.get")
}


val m = Map(1 -> 2) //key是1,value是2
println(m(1)) // true
println(m(2)) //error

//取2的值
println(m.get(1).get)
2

println(m.getOrElse(2, "None"))
None

Option None Some各自的写法:
  abstract class Option[+A]
  case class Some[+A](x: A) extends Option[A]
  case object None extends Option[Nothing]


Tuple : 元组

// 元组:(........) 下标从1开始。
object TupleApp extends App{
  val a = (1,2,3,4,5)
  a._1

  for(i <- 0 until(a.productArity)) {
    println(a.productElement(i))
  }

  val hostPort = ("localhost",8080)
  hostPort._1
  hostPort._2
}

原文地址:https://www.cnblogs.com/green-frog-2019/p/11354377.html