Scala集合函数方法(二)

Scala集合函数方法(二)

函数名

indexOfSlice indexWhere indices init inits intersect
isDefinedAt isEmpty isTraversableAgain iterator last lastIndexOf
lastIndexOfSlice lastIndexWhere lastOption length lengthCompare lift
map max maxBy min minBy mkString
nonEmpty orElse padTo par partition patch
permutations prefixLength product reduce reduceLeft reduceLeftOption
reduceOption reduceRight reduceRightOption repr reverse reverseIterator
reverseMap runWith sameElements scan scanLeft scanRight
segmentLength seq size

具体函数方法

indexOfSlice

def lastIndexOfSlice[B >: A](that : scala.collection.GenSeq[B]) : scala.Int = { /* compiled code */ }
def lastIndexOfSlice[B >: A](that : scala.collection.GenSeq[B], end : scala.Int) : scala.Int = { /* compiled code */ }

检测当前序列中是否包含序列 that,并返回最后一次出现该序列的索引 (可以指定索引,往前查找)

val a = Array(1,2,3,4,5,2,3,6,7,2,3)
val b = Array(2, 3)
println(a.indexOfSlice(b)) // 1
println(a.indexOfSlice(b,3)) // 5

indexWhere

 def indexWhere(p : scala.Function1[A, scala.Boolean]) : scala.Int = { /* compiled code */ }

返回当前序列中第一个满足条件 p 的元素的索引,可以指定从索引 from 开始查找

val a = Array(1, 2, 3, 4)
println(a.indexWhere(x => x > 2)) // 2
println(a.indexWhere(x => x > 2, 3)) // 3

indices

 def indices : scala.collection.immutable.Range = { /* compiled code */ }

返回当前序列索引集合

val a = Array(1, 2, 3, 4)
val b = a.indices
println(b.mkString(",")) // 0,1,2,3

init

 override def init : Repr = { /* compiled code */ }

返回当前序列中不包含最后一个元素的序列(即去掉序列的尾元素)

val a = Array(1, 2, 3, 4)
val b = a.init
println(b.mkString(",")) // 1,2,3

inits

 def inits : scala.collection.Iterator[Repr] = { /* compiled code */ }

对集合中的元素进行 init 迭代操作,该操作的返回值中, 第一个值是当前序列的副本,最后一个值为空,每一步都进行 init 操作,上一步的结果作为下一步的操作对象

val a = Array(1, 2, 3, 4)
val b = a.inits.toList
for (i <- 0 until b.length) {
  val s = "第 %d 个值: %s"
  println(s.format(i + 1, b(i).mkString(",")))
}
/*
 * 第 1 个值: 1,2,3,4
 * 第 2 个值: 1,2,3
 * 第 3 个值: 1,2
 * 第 4 个值: 1
 * 第 5 个值: 
 */

intersect

def intersect[B >: A](that : scala.collection.GenSeq[B]) : Repr = { /* compiled code */ }

取两个集合的交集,可以和diff结合来记忆

val a = Array(1, 2, 3, 4)
val b = Array(3, 4, 5, 6)
val c = a.intersect(b)
println(c.mkString(",")) // 3,4

isDefinedAt

def isDefinedAt(idx : scala.Int) : scala.Boolean = { /* compiled code */ }

判断序列中是否存在指定索引

val a = Array(1, 2, 3, 4)
println(a.isDefinedAt(1)) // true
println(a.isDefinedAt(5)) // false

isEmpty

override def isEmpty : scala.Boolean = { /* compiled code */ }

判断序列是否为空

val a = Array(1, 2, 3, 4)
val b = new Array[Int](0)
println(a.isEmpty) // false
println(b.isEmpty) // true

isTraversableAgain

final def isTraversableAgain : scala.Boolean = { /* compiled code */ }

判断序列是否可以反复遍历,该方法是 GenTraversableOnce 中的方法,对于 Traversables 一般返回 true,对于 Iterators 返回 false,除非被复写

val a = Array(1, 2, 3, 4)
val b = a.iterator
println(a.isTraversableAgain) // true
println(b.isTraversableAgain) // false

iterator

override def iterator : scala.collection.Iterator[A] = { /* compiled code */ }

生成当前序列的迭代器

val a = Array(1, 2, 3, 4)
val b = a.iterator
println(b.mkString(",")) // 1,2,3,4

last

override def last : A = { /* compiled code */ }

返回序列的最后一个元素,如果序列为空,将引发错误

val a = Array(1, 2, 3, 4)
println(a.last) // 4

lastIndexOf

def indexOfSlice[B >: A](that : scala.collection.GenSeq[B]) : scala.Int = { /* compiled code */ }
def indexOfSlice[B >: A](that : scala.collection.GenSeq[B], from : scala.Int) : scala.Int = { /* compiled code */ }

返回元素 elem 在序列中最后一次出现的索引 (后面加一个参数是从指定的这个参数索引开始,向前遍历,找到第一个符合的元素的索引)

val a = Array(1, 3, 2, 3, 4)
println(a.lastIndexOf(3)) // 3
println(a.lastIndexOf(3, 2)) // 1

lastIndexOfSlice

def lastIndexOfSlice[B >: A](that : scala.collection.GenSeq[B]) : scala.Int = { /* compiled code */ }
def lastIndexOfSlice[B >: A](that : scala.collection.GenSeq[B], end : scala.Int) : scala.Int = { /* compiled code */ }

检测当前序列中是否包含序列 that,并返回最后一次出现该序列的索引 (可以指定索引,往前查找)

val a = Array(1, 2, 3, 2, 3, 4)
val b = Array(2, 3)
println(a.lastIndexOfSlice(b))    // 3
println(a.lastIndexOfSlice(b, 2)) // 1

lastIndexWhere

def lastIndexWhere(p : scala.Function1[A, scala.Boolean]) : scala.Int = { /* compiled code */ }
def lastIndexWhere(p : scala.Function1[A, scala.Boolean], end : scala.Int) : scala.Int

返回当前序列中最后一个满足条件 p 的元素的索引 (可以指定索引,往前查找)

val a = Array(1, 2, 3, 4)
println(a.lastIndexWhere(x => x > 2)) // 3
println(a.lastIndexWhere(x => x > 2, 2)) // 2

lastOption

 def lastOption : scala.Option[A] = { /* compiled code */ }

返回序列的最后一个元素的 Option 类型对象,如果序列为空,则返回 None

val a = Array(1, 2, 3, 4)
println(a.lastOption) // Some(4)

length

 def length : scala.Int = { /* compiled code */ }

返回序列元素个数

val a =Array(1,2,3,4)
a.length
Int = 4

lengthCompare

override def lengthCompare(len : scala.Int) : scala.Int = { /* compiled code */ }

比较序列的长度和参数 len,返回序列的长度 - len

val a = Array(1, 2, 3, 4)
//就是拿前面的数组的长度减去后面给的参数数,得到的值就是返回值,分为大于零,小于零,等于零
println(a.lengthCompare(3)) // 1
println(a.lengthCompare(4)) // 0
println(a.lengthCompare(5)) // -1

lift

def lift: Int => Option[Int]

给序列的索引,返回该索引处的Option类的值

val a = Array(1, 2, 3, 4)
a.lift(1)
Option[Int] = Some(2)

map

def map[B, That](f : scala.Function1[A, B])(implicit bf : scala.collection.generic.CanBuildFrom[Repr, B, That]) : That = { /* compiled code */ }

对序列中的元素进行 f 操作,返回生成的新序列

val a = Array(1, 2, 3, 4)
val b = a.map(x => x * 10)
println(b.mkString(",")) // 10,20,30,40

max

max[B >: A](implicit cmp : scala.Ordering[B]) : A = { /* compiled code */ }

返回序列中最大的元素

val a = Array(1, 2, 3, 4)
println(a.max) // 4

maxBy

def maxBy[B](f : scala.Function1[A, B])(implicit cmp : scala.Ordering[B]) : A = { /* compiled code */ }

返回序列中符合条件的第一个元素

val a = Array(1, 2, 3, 4)
println(a.maxBy(x => x > 2)) // 3

min

def min[B >: A](implicit cmp : scala.Ordering[B]) : A = { /* compiled code */ }

返回序列中最小的元素

val a = Array(1, 2, 3, 4)
println(a.min) // 1

minBy

def minBy[B](f : scala.Function1[A, B])(implicit cmp : scala.Ordering[B]) : A = { /* compiled code */ }

返回序列中不符合条件的第一个元素(找不到满足条件的元素返回一个元素)

val a = Array(1, 2, 3, 4)
println(a.minBy(x => x < 2)) // 2
println(a.minBy(x => x > 9)) // 1 默认第一个元素为最小,当遍历完发现没有大于5的元素,就返回第一个元素

mkString

def mkString(start : scala.Predef.String, sep : scala.Predef.String, end : scala.Predef.String) : scala.Predef.String = { /* compiled code */ }

将序列中所有元素拼接成一个字符串,可以设置参数:mkString(start, sep, end) 将序列中所有元素拼接成一个字符串,以 start 开头,以 sep 作为元素间的分隔符,以 end 结尾)

val a = Array(1, 2, 3, 4)
println(a.mkString)   // 1234
println(a.mkString("(", ",", ")")) // (1,2,3,4)

nonEmpty

def nonEmpty : scala.Boolean = { /* compiled code */ }

判断序列是否不为空

val a = Array(1, 2, 3, 4)
val b = new Array[Int](0)
println(a.nonEmpty) // true
println(b.nonEmpty) // false

orElse

final def orElse[B >: A](alternative : => scala.Option[B]) : scala.Option[B] = { /* compiled code */ }

与 getOrElse(value) 类似,只不过 orElse 参数为Some, 返回Option里的Some或从参数传递进去的Some

val a = Some("Hello Option")
a.orElse(null)  //返回option的Some
val b = None
b.orElse(Some("New Value"))  //返回参数的Some

padTo

def padTo[B >: A, That](len : scala.Int, elem : B)(implicit bf : scala.collection.generic.CanBuildFrom[Repr, B, That]) : That = { /* compiled code */ }

填充序列,如果当前序列长度小于 len,那么新产生的序列长度是 len,多出的几个位值填充 elem,如果当前序列长度大于等于 len ,则返回当前序列

val a = Array(1, 2, 3, 4)
val b = a.padTo(7, 8)  //填充一个长度为 7 的序列,不足位补 8
println(b.mkString(",")) // 1,2,3,4,8,8,8
val c = a.padTo(3, 5)  //填充序列长度3,不足位补5,长度够的情况下不做操作
println(c.mkString(","))  //1,2,3,4

par

override def par : scala.collection.parallel.mutable.ParArray[T] = { /* compiled code */ }

开启分区,并行执行任务

val a = Array(1, 2, 3, 4, 5)
a.foreach(print)  //12345
println()
a.par.foreach(print)  //32145

//获取参与执行任务的线程
(0 to 10000).collect{case _ => Thread.currentThread.getName}.distinct
//获取并行参与执行任务的线程
(0 to 10000).par.collect{case _ => Thread.currentThread.getName}.distinct

partition

def partition(p : scala.Function1[A, scala.Boolean]) : scala.Tuple2[Repr, Repr] = { /* compiled code */ }

按条件将序列拆分成两个数组,满足条件的放到第一个数组,其余的放到第二个数组,返回的是包含这两个数组的元组

val a = Array(1, 2, 3, 4)
val b: (Array[Int], Array[Int]) = a.partition(x => x % 2 == 0)
println("偶数: " + b._1.mkString(",")) // 偶数: 2,4
println("奇数: " + b._2.mkString(",")) // 奇数: 1,3

patch

  def patch[B >: A, That](from : scala.Int, patch : scala.collection.GenSeq[B], replaced : scala.Int)(implicit bf : scala.collection.generic.CanBuildFrom[Repr, B, That]) : That = { /* compiled code */ }

批量替换,从原序列的 from 处开始,后面的 replaced 个元素,将被替换成序列 that

val a = Array(1, 2, 3, 4)
val b = Array(7, 8, 9)
val c = a.patch(1, b, 2)
println(c.mkString(",")) // 1,7,8,9,4

permutations

def permutations : scala.collection.Iterator[Repr] = { /* compiled code */ }

排列组合会选出所有排列顺序不同的字符组合,与 combinations 不同的是,对于相同的字符组合,比如 “abc”、“cba”,视为不同的组合

val a = Array("a", "b", "c")
val b = a.permutations.toList
b.foreach( x => println(x.mkString(",")))
/*
* a,b,c
* a,c,b
* b,a,c
* b,c,a
* c,a,b
* c,b,a
*/

prefixLength

def prefixLength(p : scala.Function1[A, scala.Boolean]) : scala.Int = { /* compiled code */ }

给定一个条件 p,返回满足条件的元素个数

val a = Array(1, 2, 3, 4)
println(a.prefixLength(x => x < 3)) // 2

product

def product[B >: A](implicit num : scala.Numeric[B]) : B = { /* compiled code */ }

返回所有元素乘积的值

val a = Array(1, 2, 3, 4)
println(a.product) // 1*2*3*4=24

reduce

def reduce[A1 >: A](op : scala.Function2[A1, A1, A1]) : A1 = { /* compiled code */ }

同 fold,将序列中的元素按给定的操作依次进行。但不需要初始值

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]) {
  val a = Array(1, 2, 3, 4)
  val b = a.reduce(seqno)
  println("b = " + b)
}  
/*
* seq_exp = 1 + 2
* seq_exp = 3 + 3
* seq_exp = 6 + 4
* b = 10
*/

reduceLeft

override def reduceLeft[B >: A](op : scala.Function2[B, A, B]) : B = { /* compiled code */ }

同 fold、foldLeft、reduce,从左向右计算,和reduce一样,也不需要初始值

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]) {
  val a = Array(1, 2, 3, 4)
  val b = a.reduce(seqno)
  println("b = " + b)
}  
/*
* seq_exp = 1 + 2
* seq_exp = 3 + 3
* seq_exp = 6 + 4
* b = 10
*/

reduceLeftOption

def reduceLeftOption[B >: A](op : scala.Function2[B, A, B]) : scala.Option[B] = { /* compiled code */ }

同 reduceLeft,只是返回的是Option,不会因为空序列而报错

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]) {
	val a = Array(1, 2, 3, 4)
	val b = a.reduceLeftOption(seqno)
	println("b = " + b)	
} 
 
/*
 * seq_exp = 1 + 2
 * seq_exp = 3 + 3
 * seq_exp = 6 + 4
 * b = Some(10)
 */

reduceOption

def reduceOption[A1 >: A](op : scala.Function2[A1, A1, A1]) : scala.Option[A1] = { /* compiled code */ }

同 reduceLeftOption

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]) {
	val a = Array(1, 2, 3, 4)
	val b = a.reduceOption(seqno)
	println("b = " + b)	
} 
/*
 * seq_exp = 1 + 2
 * seq_exp = 3 + 3
 * seq_exp = 6 + 4
 * b = Some(10)
 */

reduceRight

override def reduceRight[B >: A](op : scala.Function2[A, B, B]) : B = { /* compiled code */ }

同 foldRight,从右向左计算,不需要初始值

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]) {
	val a = Array(1, 2, 3, 4)
	val b = a.reduceRight(seqno)
	println("b = " + b)
}
/*
 * seq_exp = 3 + 4
 * seq_exp = 2 + 7
 * seq_exp = 1 + 9
 * b = 10
 */

reduceRightOption

def reduceRightOption[B >: A](op : scala.Function2[A, B, B]) : scala.Option[B] = { /* compiled code */ }

同 reduceRight

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]) {
	val a = Array(1, 2, 3, 4)
	val b = a.reduceRightOption(seqno)
	println("b = " + b)
}
/*
 * seq_exp = 3 + 4
 * seq_exp = 2 + 7
 * seq_exp = 1 + 9
 * b = 10
 */

repr

def repr : Repr = { /* compiled code */ }

repr() 函数将对象转化为供解释器读取的形式

val a = Map(1 -> "a",2 -> "b")
println(a.repr) //等于 println(a)  Map(1 -> a, 2 -> b)

val b = Array("java","scala")
println(b.repr) // 等于 println(b)  打印地址[Ljava.lang.String;@71423665

reverse

override def reverse : Repr = { /* compiled code */ }

反转序列

val a = Array(1, 2, 3, 4)
val b = a.reverse
println(b.mkString(",")) // 4,3,2,1

reverseIterator

override def reverseIterator : scala.collection.Iterator[A] = { /* compiled code */ }

生成反向迭代器

val a = Array(1, 2, 3, 4)
val b = a.reverseIterator
b.foreach(x => print(x + " ")) // 4 3 2 1

reverseMap

def reverseMap[B, That](f : scala.Function1[A, B])(implicit bf : scala.collection.generic.CanBuildFrom[Repr, B, That]) : That = { /* compiled code */ }

同 map,方向相反

val a = Array(1, 2, 3, 4)
val b = a.reverseMap(x => x * 10)
println(b.mkString(",")) // 40,30,20,10

runWith

def runWith[U](action : scala.Function1[B, U]) : scala.Function1[A, scala.Boolean] = { /* compiled code */ }

执行偏函数,当参数不在定义域内时,返回false,否则返回true,并执行action

val pf: PartialFunction[Int, Int] = {
 case m: Int if m % 2 == 1=> m * 2
}
pf.runWith(println)(3)
// return: Boolean = true
pf.runWith(println)(2)
// return: Boolean = false

sameElements

override def sameElements[B >: A](that : scala.collection.GenIterable[B]) : scala.Boolean = { /* compiled code */ }

判断两个序列是否顺序和对应位置上的元素都一样

val a = Array(1, 2, 3, 4)

val b = Array(1, 2, 3, 4)
println(a.sameElements(b)) // true

val c = Array(1, 3, 2, 4)
println(a.sameElements(c)) // false

val d = Array(1, 2, 3, 4, 5)
println(a.sameElements(d)) // false

scan

def scan[B >: A, That](z : B)(op : scala.Function2[B, B, B])(implicit cbf : scala.collection.generic.CanBuildFrom[Repr, B, That]) : That = { /* compiled code */ }

同 fold,scan 会把每一步的计算结果放到一个新的集合中返回,而 fold 返回的是最后的结果

val a = Array(1, 2, 3, 4)
val b = a.scan(5)(_ + _)
println(b.mkString(",")) // 5,6,8,11,15

scanLeft

def scanLeft[B, That](z : B)(op : scala.Function2[B, A, B])(implicit bf : scala.collection.generic.CanBuildFrom[Repr, B, That]) : That = { /* compiled code */ }

同 scan,从左向右计算,每一步的计算结果放到一个新的集合中返回

val a = Array(1, 2, 3, 4)
val b = a.scanLeft(5)(_ + _)
println(b.mkString(",")) // 5,6,8,11,15

scanRight

def scanRight[B, That](z : B)(op : scala.Function2[A, B, B])(implicit bf : scala.collection.generic.CanBuildFrom[Repr, B, That]) : That = { /* compiled code */ }

同 foldRight,从右向左计算,每一步的计算结果放到(从右向左放)一个新的集合中返回

val a = Array(1, 2, 3, 4)
val b = a.scanRight(5)(_ + _)
println(b.mkString(",")) // 15,14,12,9,5

segmentLength

override def segmentLength(p : scala.Function1[A, scala.Boolean], from : scala.Int) : scala.Int = { /* compiled code */ }

从序列的 from 开始向后查找,返回满足条件 p 的连续元素的长度,只返回一次

val a = Array(1, 2, 3, 1, 1, 1, 4, 1, 2, 3)
println(a.segmentLength(x => x < 3, 3)) // 3

seq

def seq : scala.collection.mutable.IndexedSeq[T] = { /* compiled code */ }

产生一个引用当前序列的 sequential 视图,就是一个特殊的集合

val a = Array(1, 2, 3, 4)
val b = a.seq
println(b.mkString(",")) // 1,2,3,4

size

override def size : scala.Int = { /* compiled code */ }

返回当前序列中从 from 到 until 之间的序列,不包括 until 处的元素(左闭右开)

val a = Array(1, 2, 3, 4)
val b = a.slice(1, 3)
println(b.mkString(",")) // 2,3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值