Scala中 implicit 用法
Background最近一段时间接手了几个Spark相关的大数据项目,主要使用Scala来编写代码,做了几个需求,感觉Scala这门语言还挺有意思,Scala以前也学习过,但是是很早了,很多语法点都忘了,在工作中经常编写的代码是Spark Job,使用stream的方式来编写代码,感觉非常的舒服。Spark中经常使用的一个操作是使用$来选择Column,比如下面使用$选择dt这一列,
Background最近一段时间接手了几个Spark相关的大数据项目,主要使用Scala来编写代码,做了几个需求,感觉Scala这门语言还挺有意思,Scala以前也学习过,但是是很早了,很多语法点都忘了,在工作中经常编写的代码是Spark Job,使用stream的方式来编写代码,感觉非常的舒服。Spark中经常使用的一个操作是使用$来选择Column,比如下面使用$选择dt这一列,
特质的构造顺序 1. 超类的构造器 2. 特质由左至右构造 3. 每个特质中,父特质先被构造 4. 多个特质公用一个父特质,而那个特质已经被构造,则不会被再次构造 5. 所有特质构造完毕,子类被构造 eg: 其中 FileLogger和ShortLogger都继承Logger特质 1calss SavingsAccount extends Account with FileLogger with ShortLogger 构造顺序 1.Account(超类) 2.Logger(第一个特质的父特质) 3.FileLogger(第一个特质) 4.ShortLogger(第一个特质) 5.SavingAccount(类)
模式匹配scala有一套内建的模式匹配机制,这种机制允许在任何类型的数据上与第一个匹配策略匹配。模式匹配可以应用在很多场合,switch语句,类型检查以及提取对象中的的复杂表达式。 下面是一个小例子,说明如何与一个整型值匹配: 12345678object MatchTest1 extends App { def matchTest(x: Int): String = x match { case 1 => "one" case 2 => "two" case _ => "many" } println(matchTest(3))}
首先是一个用Scala写的简单的快速排序的栗子(非函数式): 123456789101112131415161718192021def sort(xs: Array[Int]) { def swap(i: Int, j: Int) { val t = xs(i); xs(i) = xs(j); xs(j) = t } def sort1(l: Int, r: Int) { val pivot = xs((l + r) / 2) var i = l; var j = r while (i <= j) { while (xs(i) < pivot) i += 1 while (xs(j) > pivot) j -= 1 if (i <= j) { swap(i, j) i += 1 j -= 1 } } if (l < j) sort1(l, j) if (j < r) sort1(i, r) } sort1(0, xs.length - 1) }
Scala吸收了收并继承了多种语言中的优秀特性,另一方面也没有抛弃Java这个强大的平台,它可以运行在 Java 虚拟机之上,能够轻松地与Java互联互通。与Java不同的是,Scala既支持面向对象的特性,又支持函数式编程,被称为是Java的替代语言,是更好的Java,下面开始学习这一强大的语言。 Scala和Java比较在Scala中 所有类型都是对象 函数是对象 支持Domain specific language (DSL)领域特定语言 特质(Trait) 闭包(Closure),嵌套函数 Erlang支持的并发设计 类型推导 基础语法表达式scala> 1 + 1 res0: Int = 2 res0是解释器自动创建的变量名称,指代表达式计算的结果,是Int类型的,值为2。在scala几乎一切都是表达式。 变量和值可以将表达式赋给一个或者不变量(val)–值或者变量(var) scala> val two = 1 + 1 two: Int = 2 如果需要以后修改这个名称和结果的绑定,需要使用var(变量),大部分的情况下用val的情况居多。 scala> var name = "zhaohongxuan" name: java.lang.String = zhaohongxuan scala> name = "zhaoxiaoxuan" name: java.lang.String = zhaoxiaoxuan