Scala Trait Traversable | Set-1

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

在此示例中,使用yieldmylist列表中提取了所有偶数。 首先使用for循环遍历mylist中的每个元素。 对于每个元素,使用if条件来检查它是否为偶数。 如果是,以及这个条件为真,则在生成的新集合中将该元素纳入考虑。最终,新构建的列表只包含偶数。

结论

Traversable是Scala集合框架的核心。它提供了对集合中元素进行各种操作的能力,例如逐个遍历、过滤、映射、合并、分组和匹配。可以通过使用yield将Traversable产生的每个结果聚合成一个集合。 Scala的许多集合类,例如List、Set和HashMap都实现了Traversable特征,这使得它们具有Traversable特征的所有方法,因此是可扩展的。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程