【scala 高级函数】快速了解scala高级函数用法

来源:互联网 发布:arp s绑定mac 编辑:程序博客网 时间:2024/05/19 20:47

主要内容:
1、scala 的mkString 使用
2、Scala的List/Set/Tuple使用
3、Scala的Map和Option的使用
4、Scala的集合内常用的操作
5、Scala的泛型:类与方法的使用
6、Scala的implicit:隐式转换、隐式参数、隐式类

1、Scala的mkString使用

如果你想要把集合元素转化为字符串,那麽请使用mkString 函数。同时可能还会添加分隔符,前缀,后缀。

package DataStructureAndAlgorithm/**  * Created by Administrator on 2017/12/20.  */object Test20ScalaMkString {  // mkString的使用  val a = Array("apple", "banana", "cherry")  val b = Array(Array("a", "b"), Array("c", "d"))  def main(args: Array[String]) {//    把数组转换为字符串      println(a.mkString)//    使用mkString方法你会看到结果并不漂亮,我们来加一个分隔符:    println(a.mkString(","))    println(a.mkString(" "))//    同样你可以添加一个前缀和一个后缀    println(a.mkString("[",",","]"))//如果你想把一个潜逃集合转化为一个字符串,比如嵌套数组,首先你要展开这个嵌套数组,然后调用mkString方法    println(a.flatten.mkString(","))    println(b.flatten.mkString(","))  }}

运行结果:

applebananacherryapple,banana,cherryapple banana cherry[apple,banana,cherry]a,p,p,l,e,b,a,n,a,n,a,c,h,e,r,r,ya,b,c,dProcess finished with exit code 0

2、Scala的List/Set/Tuple使用

package DataStructureAndAlgorithm/**  * Created by Administrator on 2017/12/20.  */object Test21ScalaListSetTuple {  def main(args: Array[String]) {    val a_list=List(1,2,3,4,5,6,7,8,9)    println(a_list)//    取list中的元素    println(a_list(1))//   Map的用法    val b_list=a_list.map((x:Int)=>2*x)    println(b_list)    val c_list=a_list.map(2*_)    println(c_list)//   set 集合的使用(相当于去重)    val s = Set(5, 16, 30,5,6,7,8,9,9,20,16)    println(s)//     判断元素是否包含    println(s(1))    println(s(5))//     Tuple 元组的使用    val hostPost = ("localhost", "8080")    println(hostPost)    println(hostPost._1)    println(hostPost._2)  }}

运行结果:

List(1, 2, 3, 4, 5, 6, 7, 8, 9)2List(2, 4, 6, 8, 10, 12, 14, 16, 18)List(2, 4, 6, 8, 10, 12, 14, 16, 18)Set(5, 20, 6, 9, 7, 16, 8, 30)falsetrue(localhost,8080)localhost8080Process finished with exit code 0

3、Scala的Map和Option的使用

package DataStructureAndAlgorithm/**  * Created by Administrator on 2017/12/20.  */object Test22ScalaMapOption {  def main(args: Array[String]) {    val tmp = "a" -> "b"    println(tmp)    // Map函数使用    val m = Map("a" -> "1", "b" -> "2", "c" -> "3")    println(m)    // Option的操作 (处理为空的数据)    val r1 = m.get("a").getOrElse("None")    val r2 = m.get("b").getOrElse("None")    val r3 = m.get("f").getOrElse("None")//    引用变量的用法$    println(s"m=$m, r1=$r1, r2=$r2, r3=$r3")  }}

运行结果:

(a,b)Map(a -> 1, b -> 2, c -> 3)m=Map(a -> 1, b -> 2, c -> 3), r1=1, r2=2, r3=NoneProcess finished with exit code 0

4、Scala的集合内常用的操作

foreach、 map、 flatten、 flatMap、 filter、 zip、 partition 的使用说明
reduceLeft、 reduceRight、 foldLeft、 foldRight、 sortWith 的使用说明

package DataStructureAndAlgorithm/**  * Created by Administrator on 2017/12/20.  */object Test23ScalaCollectionOperations {  def main(args: Array[String]) {    val l = List(1, 2, 3, 4)    // foreach 使用(类似于map,但是没返回值)    l.foreach(print(_))    println()    val for1 = l.foreach(x => print(3 * x + "\t"))    println(s"for1=$for1")    // map 迭代    println("\n" + "_" * 30)    l.map(3 * _)    println()    l.map(print(_))    println()    val m1 = l.map(x => print(3 * x + "\t"))    // 因为是打印输出,所以元素为空    println(s"m1=$m1")    // flatten (扁平化:多个List 压缩到一个List中 )    println("\n" + "_" * 30)    val fn1 = List(List(1, 2, 3), List(4, 5))    val fn2 = List(List(1, 2, 3), List(4, 5)).flatten    println(s"fn1=$fn1, fn2=$fn2")    // flatMap(map + flatten)    // flatMap: map是对大List的元素进行操作    // _.map: 是对大list里面的小List的元素进行操作    // flatMap: flatten对最终大List的元素进行平扁化操作    println("\n" + "_" * 30)    val fm = List(List(1, 2, 3), List(4, 5))    val fm1 = fm.flatMap( _.map(3 * _))    val fm2 = fm.flatMap(x => x.map(3 * _))    println(s"fm1=$fm1, fm2=$fm2")    // filter 过滤    println("\n" + "_" * 30)    val ft1 = l.filter(_ % 2 ==0)    val ft2 = l.filter(x => x % 2 ==0)    println(s"ft1=$ft1, ft2=$ft2")    // zip (聚合 =>  生成一个装有元组的列表 ) 方法的使用    println("\n" + "_" * 30)    val a = List(1, 2, 3, 4)    val b = List(11, 12, 13, 14)    val z1 = a.zip(b)    val z2 = a zip b    println(s"z1=$z1, z2=$z2")    // partition 列表分割    println("\n" + "_" * 30)    val p1 = l.partition(_ % 2 == 0)    println(s"p1=$p1")    // reduceLeft/reduceRight 和 foldLeft/foleRight 的使用 与 区别    println("\n" + "_" * 30)    val lis = List(1,7,2,9)    // 实际是: ((1 - 7) - 2) - 9 = 1 - 7 - 2 - 9 = -17    val fc1 = lis.reduceLeft(_-_)    // 实际是: 1 - (7 - (2 - 9)) = 1 - (7 + 7) = -13    val fc2 = lis.reduceRight(_-_)    // foldLeft(初始值)(函数)    // 实际是: 0 - 1 - 7 - 2 - 9 = -19    val fc3 = lis.foldLeft(0)(_-_)    // 实际是: 1 - (7 - (2 - (9 - 0))) = 1 - 7+2 - 9 = -13    val fc4 = lis.foldRight(0)(_-_)    println(s"fc1=$fc1, fc2=$fc2, fc3=$fc3, fc4=$fc4")    // sortWith    println("\n" + "_" * 30)    val tmp_l = List(1, -3, 4, 2, 6)    println("小到大排序: "+ tmp_l.sortWith(_ < _))    println("大到小排序: " + tmp_l.sortWith(_ > _))  }}
12343   6   9   12  for1=()______________________________12343   6   9   12  m1=List((), (), (), ())______________________________fn1=List(List(1, 2, 3), List(4, 5)), fn2=List(1, 2, 3, 4, 5)______________________________fm1=List(3, 6, 9, 12, 15), fm2=List(3, 6, 9, 12, 15)______________________________ft1=List(2, 4), ft2=List(2, 4)______________________________z1=List((1,11), (2,12), (3,13), (4,14)), z2=List((1,11), (2,12), (3,13), (4,14))______________________________p1=(List(2, 4),List(1, 3))______________________________fc1=-17, fc2=-13, fc3=-19, fc4=-13______________________________小到大排序: List(-3, 1, 2, 4, 6)大到小排序: List(6, 4, 2, 1, -3)Process finished with exit code 0

5、Scala的泛型:类与方法的使用

package DataStructureAndAlgorithm/**  * Created by Administrator on 2017/12/21.  */// 泛型类class Test24ScalaGenericity[T, S](val first: T, val second: S) {  // 泛型方法  def compute[W](list: List[W]) = list.foreach(x => print(x + "\t"))}object Test24ScalaGenericity{  def main(args: Array[String]) {    val t = new Test24ScalaGenericity[Int, String](1, "laidefa")    println(t.first + " : " + t.second)    t.compute[Int](List(1, 2, 3))  }}
1 : laidefa1   2   3   Process finished with exit code 0

6、Scala的implicit:隐式转换、隐式参数、隐式类

package DataStructureAndAlgorithm/**  * Created by Administrator on 2017/12/21.  *//** 如何 为类添加默认的自定义方法 ???* 背景: 我们调用别人的框架,发现少了一些方法,需要添加,但是让别人为你一个人添加是不可能滴* 所以:通过隐式转换,添加自定义方法* 1. 例如 对A这个类添加一个rich方法* 2. 我们新建一个 RichA这个类,传入变量 A这个类* 3. 在RichA这个类中添加一个rich方法* 4. 隐式转换:自定义 a2RichA 方法,new RichA这个类,传入参数 A 这个类* 5. new A 这个类,发现新的对象a, 有rich 方法叻* */class A{}class RichA(a: A){  def rich{    println("rich ... ")  }}object Test25ScalaImplicit {  def testParam(implicit name: String) {    println(name)  }  // 自定义的隐式类  implicit class Calculator(x: Int) {    def add_10(a: Int): Int = (x + a) * 10  }  def main(args: Array[String]) {    // 1.隐式转换    implicit def a2RichA(a: A) = new RichA(a)    // 新建变量    val a = new A    a.rich    // 2.隐式参数    // 设置隐式变量的值    implicit val name = "implicit!!!"    // 设置隐式变量的值    testParam    //    // 如果不传入参数:报错    //    testParam()    // 自定义参数    testParam("xxx")    // 3.隐式类:    // 为Int类型,添加一个自定义的 add方法    // 调用隐式类    println(4.add_10(10))  }}
rich ... implicit!!!xxx140Process finished with exit code 0