Scala Trait Traversable | Set-1
在Scala语言中,Traversable是Trait中的一种。它是所有集合类型的最顶层的特征(Trait),是Scala collections框架的核心构架。Traversable提供了许多方法来操作集合中的元素,例如foreach,map和filter。我们可以使用Traversable来遍历集合中的元素,从而进行各种集合操作。
阅读更多:Scala 教程
Traversable可扩展的集合
任何具体集合类型,比如List、Set和HashMap都实现了Traversable特征。这意味着任何默认的Scala集合类型都是可扩展的,具有Traversable特征的所有方法。
val mylist = List(1,2,3,4,5,6)
val myset = Set(1,2,3,4,5,6)
val mymap = Map((1, "one"),(2, "two"),(3, "three"))
//遍历列表
println("Traversable List Output")
mylist.foreach(println)
//遍历集合
println("\nTraversable Set Output")
myset.foreach(println)
//遍历Map
println("\nTraversable Map Output")
mymap.foreach(println)
输出结果
Traversable List Output
1
2
3
4
5
6
Traversable Set Output
5
1
6
2
3
4
Traversable Map Output
(1,one)
(2,two)
(3,three)
在上面的示例代码中,首先创建了一个列表,一个集合和一个Map。然后使用forEach方法来遍历这些集合并输出结果。
Traversable操作
Traversable提供了各种操作来处理集合,例如:
1. 过滤
filter (p: (A) => Boolean): Repr
筛选出所有符合谓词p
的元素,返回一个与原始集合类型相同的新集合。
val filtered = mylist.filter(_%2==0)
println("\nFilteredList Output")
filtered.foreach(println)
输出结果
FilteredList Output
2
4
6
2. 映射
map [B] (f: (A) => B): Traversable[B]
将函数f
应用于集合中的每个元素,并返回一个包含所有f
应用后元素的新集合。
val mapped = myset.map(x=>x*2)
println("\nMapped Set Output")
mapped.foreach(println)
输出结果
Mapped Set Output
10
2
12
4
6
8
3. 合并
fold[B](z: B)(op: (B, A) => B): B
将所有元素应用于累加器函数 op
以便获取表达式的结果。此表达式被初始化为 z
。
val folded = mylist.fold(0){(sum, i)=> sum + i}
println(folded)
输出结果
21
4. 分组
groupBy[K](f: (A) => K): Map[K, Traversable[A]]
根据函数f
返回的关键字将同一类元素分组,并返回一个Map
对象,其中关键字K
映射到具有相同关键字K
的元素集合。
val grouped = mylist.groupBy(x=> if(x%2==0) "even" else "odd")
println("\nGrouped Output")
grouped.foreach(println)
输出结果
Grouped Output
(even,List(2, 4, 6))
(odd,List(1, 3, 5))
5. 匹配
collect[B](pf: PartialFunction[A, B]): Traversable[B]
使用部分类函数将符合条件的元素抽取并转换成新集合。
val mygroup = List("one","two","three",4)
val mappedgroup= mygroup.collect {
case s: String => s.toUpperCase
}
println("\nCollected Output")
mappedgroup.foreach(println)
输出结果
Collected Output
ONE
TWO
THREE
在此示例中,使用collect
方法从包含字符串和数字的列表中,筛选出所有字符串并转换为大写形式。
Traversable与yield
在Scala中,yield
关键字可以用于将Traversable产生的每个结果聚合成一个集合。下面的示例演示了如何使用yield
将集合中的每个元素累加并生成一个新的集合。
val mylist = List(1,2,3,4,5,6)
val newlist = for {
n <- mylist
if n%2==0
} yield n
println("\nYield Output")
newlist.foreach(println)
输出结果
Yield Output
2
4
6
在此示例中,使用yield
从mylist
列表中提取了所有偶数。 首先使用for循环遍历mylist
中的每个元素。 对于每个元素,使用if
条件来检查它是否为偶数。 如果是,以及这个条件为真,则在生成的新集合中将该元素纳入考虑。最终,新构建的列表只包含偶数。
结论
Traversable是Scala集合框架的核心。它提供了对集合中元素进行各种操作的能力,例如逐个遍历、过滤、映射、合并、分组和匹配。可以通过使用yield
将Traversable产生的每个结果聚合成一个集合。 Scala的许多集合类,例如List、Set和HashMap都实现了Traversable特征,这使得它们具有Traversable特征的所有方法,因此是可扩展的。