目录
++ ++: +: :+ /: :\
ACFunctionTest
DEFFunctionTest
GHIFunctionTest
LMNFunctionTest
++ ++: +: :+ /: :\
package test object demo1 { def main(args: Array[String]): Unit = { val arr=Array(1,2,3,4) val first=arr(0) arr(3)=100 val newarr=arr.map(_ *2) println(first) println(newarr.mkString(",")) val a=List(1,2) val b=scala.collection.mutable.LinkedList(3,4) val c=a++:b val d=b++:a val e=a++b val f=b++a println(e) println(f) println(c) println(d) println(c.getClass().getName()) val g=List(1,2) val h=0 +:g println(h.mkString(",")) } }
package test object demo2 { def main(args: Array[String]): Unit = { val a=List(1,2,3,4) val b=(10/:a)(_+_) println(b) val c=List(1,2,3,4) val d=(c :\ 10)(_-_) println(d) } }
ACFunctionTest
package test import scala.collection.mutable.ArrayBuffer object ACFunctionTest { def main(args: Array[String]): Unit = { //apply 获取指定索引处的元素 val a=List(1,10,100,100) val b=a.apply(1) println(b) //10 // val a1=List(1,2,3,4) // val b1=new StringBuilder() // a1.addString(b1) // println(b1) // // // val a2=List(1,2,3,4) // val b2=new StringBuilder() // a2.addString(b2,"-") // println(b2) //canEqual 判断两个对象是否可以进行比较 val a1=List(1,2,3,4) val b1=Array('a','b','c') println(a1.canEqual(b1)) //true //charAt 获取 index 索引处的字符,这个方法会执行一个隐式的转换, // 将 Array[T] 转换为 ArrayCharSequence,只有当 T 为 Char 类型时,这个转换才会发生 val chars = Array('a', 'b', 'c') println(chars.charAt(0)) // a //clone 创建一个副本 val a2 = Array(1, 2, 3, 4) val b2 = a2.clone() println(b2.mkString(",")) // 1,2,3,4 //collect 偏函数 通过执行一个并行计算(偏函数),得到一个新的数组对象 val fun1: PartialFunction[Char, Char] = { case 'a' => 'A' case x => x } val a3 = Array('a', 'b', 'c') val b3 = a3.collect(fun1) println(b3.mkString(",")) // A,b,c //collectFirst 查找第一符合偏函数定义的元素 执行偏函数计算 val fun2:PartialFunction[Any,Int]={ case x:Int=>x*100 } val a4=Array(3,1,'a',"b") val b4=a4.collectFirst(fun2) println(b4) //Some(300) // b = arr.collectFirst({ case x: Int => x * 100 }) //combinations combinations 表示组合,这个排列组合会选出所有包含字符不一样的组合, // 但不考虑顺序,对于 “abc”、“cba”,视为相同组合, // 参数 n 表示序列长度,就是几个字符为一组 val a5=Array("a","b","c","d") val b5=a5.combinations(2) b5.foreach(x=> println(x.mkString(","))) //foreach遍历 //a,b //a,c //a,d //b,c //b,d //c,d //contains 判断序列中是否包含指定对象 val a6=List(1,2,3,4) println(a.contains(1)) //true //containsSilce 判断当前序列中是否包含另一个序列 val a7=List(1,2,3,4) val b6=List(3.2) val b7=List(2,3) println(a7.containsSlice(b6)) //false println(a7.containsSlice(b7)) //true //copyToArray(xs) 将当前数组元素复制到另一个数组中 val a8=Array(1,2,3) val b8:Array[Int]=new Array(5) println(b8.mkString(",")) a8.copyToArray(b8) println(b8.mkString(",")) //0,0,0,0,0 //1,2,3,0,0 //copyToArray(xs, start) 将当前数组元素复制到另一个数组中,从 start 位置开始复制 val a9=Array(1,2,3) val b9:Array[Int]=new Array(7) a9.copyToArray(b9,3) println(b9.mkString(",")) //0,0,0,1,2,3,0 //copyToArray(xs, start, len) 将当前数组元素复制到另一个数组中,从 start 位置开始复制,长度为 len val a10=Array(1,2,3) val b10:Array[Int]=new Array(10) a10.copyToArray(b10,1,2) println(b10.mkString(",")) //0,1,2,0,0,0,0,0,0,0 //copyToBuffer 将数组中的元素复制到 Buffer 中 val a11 = Array(1, 2, 3, 4) val b11: ArrayBuffer[Int]=ArrayBuffer() a11.copyToBuffer(b11) println(b11.mkString(",")) // 1,2,3,4 // corresponds 判断两个序列的长度以及对应位置元素是否符合某个条件。 // 如果两个序列具有相同的元素数量并且 p(x, y)=true,则返回 true val a12=Array(1,2,3,4) val b12=Array(5,6,7,8) println(a12.corresponds(b12)(_ < _)) //true // count 统计符合条件的元素个数 val a13=Array(1,2,3,4) println(a13.count(x => x > 2)) //2 } }
package test object TestAggregate { def main(args: Array[String]): Unit = { } val a=Array(7,8,9,10,11,12,13) println(a.par.aggregate((10, 0))( (x, y) => { println("seqop",x,y) if (y > x._1) { (x._1, x._2 + 1) } else { x } }, (x, y) => { println("combop",x,y) (x._1, x._2 + y._2) } )) println("----------------------------------") println(a.par.aggregate(0)( (x, y) => { println("seqop",x, y) if (x > y) { x } else { y } }, (x, y) => { println("combop",x, y) x + y } )) println("---------------------------------") println(a.aggregate((10, 0))( (x, y) => { if (y > x._1) { (x._1, x._2 + 1) } else { x } }, (x, y) => { (x._1, x._2 + y._2) } )) }
DEFFunctionTest
package test object DEFFunctionTest { def main(args: Array[String]): Unit = { //diff 计算当前数组与另一个数组的差集,即将当前数组中没有在另一个数组中出现的元素返回 val a=Array(1,2,3,4) val b=Array(3,4,5,6) val c=a.diff(b) println(c.mkString(",")) //distinct 去除当前集合中重复的元素,只保留一个 val a1=Array(1,2,3,4,4,3) val b1=a1.distinct println(b1.mkString(",")) //drop 将当前数组中前 n 个元素去除,返回一个新数组 val a2=Array(1,2,3,4) val b2=a2.drop(2) println(b2.mkString(",")) //dropRight 功能同 drop,去掉尾部的 n 个元素 val a3=Array(1,2,3,4) val b3=a3.dropRight(2) println(b3.mkString(",")) //dropWhile 去除当前数组中符合条件的元素,返回剩余的数组, // 这个需要一个条件,就是从当前数组的第一个元素起,就要满足条件, // 直到碰到第一个不满足条件的元素结束(即使后面还有符合条件的元素),否则返回整个数组 //下面去除数组 a 中大于 2 的元素,第一个元素 3 满足,它后面的元素 2 不满足,所以返回 (2,3,4) val a4 = Array(1, 2, 3, 4) val b4= a4.dropWhile(x => x < 2) println(b4.mkString(",")) // 2,3,4 val a5 = Array(1, 2, 3, 4) val b5 = a5.dropWhile(x => x > 2) println(b5.mkString(",")) // 1,2,3,4 //endsWith 判断当前序列是否以某个序列结尾 val a6=Array(1,2,3,4) val b6=Array(3,4) println(a6.endsWith(b6)) //true //exists 判断当前数组是否包含符合条件的元素 val a7=Array(1,2,3,4) println(a7.exists(x => x == 3)) //true println(a7.exists(x => x > 10)) //false //filter 取得当前数组中符合条件的元素,组成新的数组返回 val a8=Array(1,2,3,4) val b8=a8.filter(x=>x>2) // val b8=a8.filterNot() println(b8.mkString(",")) //3,4 //find 查找第一个符合条件的元素,返回 Option val a9=Array(1,2,3,4) val b9=a9.find(x=>x>2) println(b9) //Some(3) //flatMap 对当前序列的每个元素进行操作,结果放入新序列返回, // 参数要求是 GenTraversableOnce 及其子类 val a10=Array(1,2,3,4) val b10=a10.flatMap(x=> 1 to x) println(b10.mkString(",")) //1,1,2,1,2,3,1,2,3,4 /** * 1,1,2,1,2,3,1,2,3,4 * 从 1 开始,分别对集合 a 中的每个元素生成一个递增序列,过程如下 * 1 * 1,2 * 1,2,3 * 1,2,3,4 */ //flatten 扁平化,将二维数组的所有元素组合在一起,形成一个一维数组返回 val a11=Array(Array(1,2,3),Array(4,5,7)) val b11=a11.flatten println(b11.mkString(",")) //forall 检测序列中的元素是否都满足条件 p,如果序列为空,则返回 true val a12=Array(1,2,3,4) println(a12.forall(x => x > 0)) //true println(a12.forall(x => x > 2)) //false //foreach 遍历序列中的元素,进行 f 操作 // def foreach(f: (A) ⇒ Unit): Unit val a13=Array(1,2,3,4,6) a13.foreach(x=>println(x*10)) /** * 10 * 20 * 30 * 40 */ } }
package test object FoldLeftTest { //foldLeft 从左到右计算,简写方式:def /:[B](z: B)(op: (B, T) ⇒ B): B def seqno(m: Int, n: Int): Int = { val s = "seq_exp = %d + %d" println(s.format(m, n)) m + n } def main(args: Array[String]): Unit = { val a = Array(1, 2, 3, 4) val b = a.foldLeft(5)(seqno) // 简写: (5 /: a)(_ + _) println("b = " + b) /** * seq_exp = 5 + 1 * seq_exp = 6 + 2 * seq_exp = 8 + 3 * seq_exp = 11 + 4 * b = 15 */ } }
package test object FoldRightTest { def seqno(m: Int, n: Int): Int = { val s = "seq_exp = %d + %d" println(s.format(m, n)) m + n } def main(args: Array[String]): Unit = { val a = Array(1, 2, 3, 4) val b = a.foldRight(5)(seqno) // 简写: (a :\ 5)(_ + _) println("b = " + b) /** * seq_exp = 4 + 5 * seq_exp = 3 + 9 * seq_exp = 2 + 12 * seq_exp = 1 + 14 * b = 15 */ } }
package test object FoldTest { //fold 对序列中的每个元素进行二元运算,和 aggregate 有类似的语义,但执行过程有所不同 def seqno(m:Int,n:Int):Int={ val s="seq_exp=%d+%d" println(s.format(m, n)) m+n } def main(args: Array[String]): Unit = { val a12=Array(1,2,3,4) val b12=a12.fold(5)(seqno) //不分区 println("b12="+b12) /** * seq_exp = 5 + 1 * seq_exp = 6 + 2 * seq_exp = 8 + 3 * seq_exp = 11 + 4 * b12 = 15 */ val c12=a12.par.fold(5)(seqno) //分区 println("c12="+c12) /** * seq_exp=5+1 * seq_exp=5+2 * seq_exp=6+7 * seq_exp=5+3 * seq_exp=8+4 * seq_exp=13+12 * c12=25 */ } }
GHIFunctionTest
package test object GHIFunctionTest { def main(args: Array[String]): Unit = { // def groupBy[K](f: (T) ⇒ K): Map[K, Array[T]] //groupBy 按条件分组,条件由 f 匹配,返回值是 Map 类型,每个 key 对应一个数组 //把数组中小于 3 的元素分到一组,其他元素的分到另一组,返回 Map[String, Array[Int]] val a=Array(1,2,3,4) val b=a.groupBy(x=>x match{ case x if (x<3)=>"small" case _ =>"big" }) b.foreach(x => println(x._1 + ": " + x._2.mkString(","))) /** * small: 1,2 * big: 3,4 */ val a1=Array(59,60,100,96,87,102) val b1=a1.groupBy(s=>s match{ case s if (s<60)=>"不及格" case s if (s<90)=>"优秀" case s if (s<=100)=>"完美" case _=>"其他" }) b1.foreach(s => println(s._1 + ": " + s._2.mkString(","))) /** * 其他: 102 * 完美: 100,96 * 优秀: 60,87 * 不及格: 59 */ //grouped 按指定数量分组,每组有 size 个元素,返回一个迭代器 val a2=Array(1,2,3,4,5) val b2=a2.grouped(2).toList b2.foreach(x => println("第 " + (b2.indexOf(x) + 1) + " 组: " + x.mkString(","))) /** * 第 1 组: 1,2 * 第 2 组: 3,4 * 第 3 组: 5 */ //hasDefiniteSize 检测序列是否存在有限的长度,对应 Stream 这样的流数据则返回 false val a3 = Array(1, 2, 3, 4) println(a3.hasDefiniteSize) // true //head 返回序列的第一个元素,如果序列为空,将引发错误 val a4 = Array(1, 2, 3, 4) println(a4.head) // 1 //headOption 返回序列的第一个元素的 Option 类型对象,如果序列为空,则返回 None val a5 = Array(1, 2, 3, 4) println(a5.headOption) // Some(1) //indexOf(elem) 返回元素 elem 在序列中第一次出现的索引 val a6 = Array(1, 3, 2, 3, 4) println(a6.indexOf(3)) // 1 //indexOf(elem, from) 返回元素 elem 在序列中第一次出现的索引,指定从索引 from 开始查找 val a7 = Array(1, 3, 2, 3, 4) println(a7.indexOf(3, 2)) // 3 //indexOfSlice(that) 检测当前序列中是否包含序列 that,并返回第一次出现该序列的索引 val a8 = Array(1,7,8,2, 3, 2, 3, 4) val b8 = Array(2, 3) println(a8.indexOfSlice(b8)) // 3 //indexOfSlice(that, from) 检测当前序列中是否包含另一个序列 that // 指定从索引 from 开始查找,并返回第一次出现该序列的索引 val a9 = Array(1, 2, 3, 2, 3, 4) val b9 = Array(2, 3) println(a9.indexOfSlice(b9, 2)) // 3 //indexWhere(p) 返回当前序列中第一个满足条件 p 的元素的索引 val a10 = Array(1, 2, 3, 4) println(a10.indexWhere(x => x > 2)) // 2 //indexWhere(p, from) 返回当前序列中第一个满足条件 p 的元素的索引,指定从索引 from 开始查找 val a11 = Array(1, 2, 3, 4) println(a11.indexWhere(x => x > 2, 3)) // 3 //indices 返回当前序列索引集合 val a12 = Array(1, 2, 3, 4) val b12 = a12.indices println(b12.mkString(",")) // 0,1,2,3 //init 返回当前序列中不包含最后一个元素的序列 val a13 = Array(1, 2, 3, 4) val b13 = a13.init println(b13.mkString(",")) // 1,2,3 //inits 对集合中的元素进行 init 迭代操作,该操作的返回值中, 第一个值是当前序列的副本,最后一个值为空, // 每一步都进行 init 操作,上一步的结果作为下一步的操作对象 val a14 = Array(1, 2, 3, 4) val b14 = a14.inits.toList for (i <- 0 until b14.length) { val s = "第 %d 个值: %s" println(s.format(i + 1, b14(i).mkString(","))) } /** * 第 1 个值: 1,2,3,4 * 第 2 个值: 1,2,3 * 第 3 个值: 1,2 * 第 4 个值: 1 * 第 5 个值: */ //intersect 取两个集合的交集 val a15 = Array(1, 2, 3, 4) val b15 = Array(3, 4, 5, 6) val c15 = a15.intersect(b15) println(c15.mkString(",")) // 3,4 //isDefinedAt 判断序列中是否存在指定索引 val a16=Array(1,2,3,4) println(a16.isDefinedAt(1)) //true println(a16.isDefinedAt(5)) //false //isEmpty 判断序列是否为空 val a17=Array(1,2,3,4) val b17=new Array[Int](0) println(a17.isEmpty) //false println(b17.isEmpty) //true println("-------------------------------------------------") //isTraversableAgain 判断序列是否可以反复遍历,该方法是 GenTraversableOnce 中的方法, // 对于 Traversables 一般返回 true,对于 Iterators 返回 false,除非被复写 val a18 = Array(1, 2, 3, 4) val b18 = a18.iterator println(a18.isTraversableAgain) // true println(b18.isTraversableAgain) // false } }
LMNFunctionTest
package test object LMNFunctionTest { def main(args: Array[String]): Unit = { //last 返回序列的最后一个元素,如果序列为空,将引发错误 val a = Array(1, 2, 3, 4) println(a.last) // 4 //lastIndexOf(elem) 返回元素 elem 在序列中最后一次出现的索引 val a1 = Array(1, 3, 2, 3, 4) println(a1.lastIndexOf(3)) // 3 //lastIndexOf(elem, end) 返回元素 elem 在序列中最后一次出现的索引, // 指定在索引 end 之前(包括)的元素中查找 val a2 = Array(1, 3, 2, 3, 4) println(a2.lastIndexOf(3, 2)) // 1 //lastIndexOfSlice(that) 检测当前序列中是否包含序列 that,并返回最后一次出现该序列的索引 val a3 = Array(1, 2, 3, 2, 3, 4) val b3 = Array(2, 3) println(a3.lastIndexOfSlice(b3)) // 3 //lastIndexOfSlice(that, end) 检测当前序列中是否包含序列 that,并返回最后一次出现该序列的索引, // 指定在索引 end 之前(包括)的元素中查找 val a4 = Array(1, 2, 3, 2, 3, 4) val b4 = Array(2,3) println(a4.lastIndexOfSlice(b4, 2)) // 1 //lastIndexWhere(p) 返回当前序列中最后一个满足条件 p 的元素的索引 val a5=Array(1,2,3,4,1,8) println(a5.lastIndexWhere(_>2)) //5 //lastIndexWhere(p, end) 返回当前序列中最后一个满足条件 p 的元素的索引, // 指定在索引 end 之前(包括)的元素中查找 val a6 = Array(1, 2, 3, 4) println(a6.lastIndexWhere(x => x > 2, 2)) // 2 //lastOption 返回序列的最后一个元素的 Option 类型对象,如果序列为空,则返回 None val a7 = Array(1, 2, 3, 4) println(a7.lastOption) // Some(4) //length 返回序列元素个数 val a8 = Array(1, 2, 3, 4) println(a8.length) // 4 //lengthCompare 比较序列的长度和参数 len,返回序列的长度 - len //def lengthCompare(len: Int): Int val a9 = Array(1, 2, 3, 4) println(a9.lengthCompare(3)) // 1 println(a9.lengthCompare(4)) // 0 println(a9.lengthCompare(5)) // -1 //map def map[B](f: (A) ⇒ B): Array[B] 对序列中的元素进行 f 操作,返回生成的新序列 val a10 = Array(1, 2, 3, 4) val b10 = a10.map(x => x * 10) println(b10.mkString(",")) // 10,20,30,40 //max 返回序列中最大的元素 val a11 = Array(1, 2, 3, 4) println(a11.max) // 4 //maxBy 返回序列中符合条件的第一个元素 val a12 = Array(1, 2, 3, 4) println(a12.maxBy(x => x > 2)) // 3 //min 返回序列中最小的元素 val a13 = Array(1, 2, 3, 4) println(a13.min) // 1 //minBy 返回序列中不符合条件的第一个元素 val a14 = Array(1, 2, 3, 4) println(a14.minBy(x => x < 2)) // 2 //mkString 将序列中所有元素拼接成一个字符串 val a15 = Array(1, 2, 3, 4) println(a15.mkString) // 1234 //mkString(sep) 将序列中所有元素拼接成一个字符串,以 sep 作为元素间的分隔符 val a16 = Array(1, 2, 3, 4) println(a16.mkString(",")) // 1,2,3,4 //mkString(start, sep, end) 将序列中所有元素拼接成一个字符串,以 start 开头,以 sep 作为元素间的分隔符,以 end 结尾 val a17 = Array(1, 2, 3, 4) println(a17.mkString("(", ",", ")")) // (1,2,3,4) //nonEmpty 判断序列是否不为空 val a18 = Array(1, 2, 3, 4) val b18 = new Array[Int](0) println(a18.nonEmpty) // true println(b18.nonEmpty) // false } }