scala知识点

1. val 和 var 区别

val a = 1 不可变
var b = 1 b =2 可变


2. 基础数值类型的顶层接口Any

Any:(AnyVal:( Int、Double、Float、 Lon、…))


3. 函数可变长度参数 *

  def main(args: Array[String]): Unit = {
    mut("a")
    mut("a", "b")
    mut("a", "b","c")
  }

  def mut(params: String*) = {
    params.foreach(println)
  }

4. 占位符 _

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


4.2 _*

_* 将 nums.tail 转化为参数序列
tail : Selects all elements except the first

    def sum(nums:Int*):Int = {
      if (nums.length == 0) 0
      else nums.head + sum(nums.tail:_*)
    }
    println(sum(1,2,3,4,5))

5. apply 伴生对象中apply的作用就是new伴生类,所以在调用时不用new class

在这里插入图片描述
在这里插入图片描述


6. Nil 创建一个空的List,

    println(Nil)  // List()
    println(1 :: Nil)  //List(1)

:: 该方法被称为cons,意为构造,向队列的头部追加数据,创造新的列表。用法为 x::list,其中x为加入到头部的元素,无论x是列表与否,它都只将成为新生成列表的第一个元素,x::list等价于list.::(x))


7.可变集合 VS 不可变集合(scala.collection.mutable VS scala.collection.immutable)

    import scala.collection.mutable.ArrayBuffer
    val c = ArrayBuffer[Int]()
    println(c.length)
    c += 1
    c += 2
    c += (3, 4, 5)
    c ++= Array(6, 7, 8)
    c.foreach(x => {
      println(s"e : ${x}")
    })
0
e : 1
e : 2
e : 3
e : 4
e : 5
e : 6
e : 7
e : 8

8. 隐式转换

8.1 隐式类型转换,将一个普通类增强为一个牛逼的类 [ 公式: implicit def x2y(普通的X):牛逼的Y = new 牛逼的Y(…) ]

eg.

object T1 {
  def main(args:Array[String]):Unit = {
    val pig = new Man("猪")
    pig.fly() //猪 fly  tree >>>>
  }
  implicit def man2superman(man:Man):Superman = new Superman(man.name)
}
class Man(val name:String)
class Superman(val name:String){
  def fly():Unit = {
    println(s"${name} fly  tree >>>>")
  }
}

eg. 将隐式类型转换抽取到一个对象中,使用时导入

object ImplicitApp {
  implicit def man2superman(man:Man):Superman = new Superman(man.name)
}
---------------------------------------------------------------------------------------
import ImplicitApp.man2superman
object T1 {
  def main(args:Array[String]):Unit = {
    println(Nil)
    println(1 :: Nil)
    val pig = new Man("猪")
    pig.fly()
  }
}
class Man(val name:String)
class Superman(val name:String){
  def fly():Unit = {
    println(s"${name} fly  tree >>>>")
  }
}

spark源码中的隐式类型转换定义在伴生对象中

object RDD {

  implicit def rddToPairRDDFunctions[K, V](rdd: RDD[(K, V)])
    (implicit kt: ClassTag[K], vt: ClassTag[V], ord: Ordering[K] = null): PairRDDFunctions[K, V] = {
    new PairRDDFunctions(rdd)
  }

  implicit def rddToAsyncRDDActions[T: ClassTag](rdd: RDD[T]): AsyncRDDActions[T] = {
    new AsyncRDDActions(rdd)
  }

  implicit def rddToSequenceFileRDDFunctions[K, V](rdd: RDD[(K, V)])
      (implicit kt: ClassTag[K], vt: ClassTag[V],
                keyWritableFactory: WritableFactory[K],
                valueWritableFactory: WritableFactory[V])
    : SequenceFileRDDFunctions[K, V] = {
    implicit val keyConverter = keyWritableFactory.convert
    implicit val valueConverter = valueWritableFactory.convert
    new SequenceFileRDDFunctions(rdd,
      keyWritableFactory.writableClass(kt), valueWritableFactory.writableClass(vt))
  }

  implicit def rddToOrderedRDDFunctions[K : Ordering : ClassTag, V: ClassTag](rdd: RDD[(K, V)])
    : OrderedRDDFunctions[K, V, (K, V)] = {
    new OrderedRDDFunctions[K, V, (K, V)](rdd)
  }

  implicit def doubleRDDToDoubleRDDFunctions(rdd: RDD[Double]): DoubleRDDFunctions = {
    new DoubleRDDFunctions(rdd)
  }

  implicit def numericRDDToDoubleRDDFunctions[T](rdd: RDD[T])(implicit num: Numeric[T])
    : DoubleRDDFunctions = {
    new DoubleRDDFunctions(rdd.map(x => num.toDouble(x)))
  }
}

8.2 隐式类 为已存在的类增强新的方法和能力
object T1 {
  def main(args:Array[String]):Unit = {
    println(2.add(3))
  }
  implicit class AA(x:Int){
    def add(a:Int) = a +x
  }
}

在这里插入图片描述
在这里插入图片描述


8.3 隐式参数 上下文寻找隐式值(符合参数类型的隐式值)
object T1 {
  def main(args:Array[String]):Unit = {
    implicit val word = "world"
    sayHello
  }

  def sayHello(implicit msg:String):Unit = {
    println(s"Hello: ${msg}")
  }
}

eg. 当存在两个或者多个相同类型隐式值时,报错

object T1 {
  def main(args:Array[String]):Unit = {
    implicit val word = "world"
    implicit val word2 = "world2"
    sayHello
  }

  def sayHello(implicit msg:String):Unit = {
    println(s"Hello: ${msg}")
  }
}

在这里插入图片描述


9 scala 中 Class[T]
  /**
   * Retrieve the runtime representation of a class type. `classOf[T]` is equivalent to
   * the class literal `T.class` in Java.
   *
   * @example {{{
   * val listClass = classOf[List[_]]
   * // listClass is java.lang.Class[List[_]] = class scala.collection.immutable.List
   *
   * val mapIntString = classOf[Map[Int,String]]
   * // mapIntString is java.lang.Class[Map[Int,String]] = interface scala.collection.immutable.Map
   * }}}
   */
  def classOf[T]: Class[T] = null // This is a stub method. The actual implementation is filled in by the compiler.

  /** The `String` type in Scala has methods that come either from the underlying
   *  Java String (see the documentation corresponding to your Java version, for
   *  example [[http://docs.oracle.com/javase/8/docs/api/java/lang/String.html]]) or
   *  are added implicitly through [[scala.collection.immutable.StringOps]].
   */
  type String        = java.lang.String
  type Class[T]      = java.lang.Class[T]
10 scala与java集合互转
import collection.JavaConverters._


import collection.JavaConverters._
import collection.mutable._
val map = Map("k" -> "v")
//转换成java
val javaMap = map.asJava
//转换成 scala
javaMap.asScala

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值