Scala 实现可移植

Scala 实现可移植,scala,iterable,Scala,Iterable,如何实现与JavaIterable和C#IEnumerable相当的Scala?基本上,我希望我的集合是可映射的、可过滤的等等。集合类应该扩展哪些特性,有没有简单的方法(比如C#中的yield return和yield break)要创建枚举数?您可以使用scala.collection.Iterabletrait或其不可变版本,它们非常全面和强大。希望这会有所帮助。实现Iterable特性。所需的只是迭代器方法。所有其他方法(map,filter等)都是免费的 class MyIterable

如何实现与Java
Iterable
和C#
IEnumerable
相当的Scala?基本上,我希望我的集合是可映射的、可过滤的等等。集合类应该扩展哪些特性,有没有简单的方法(比如C#中的
yield return
yield break
)要创建枚举数?

您可以使用scala.collection.Iterabletrait或其不可变版本,它们非常全面和强大。希望这会有所帮助。

实现
Iterable
特性。所需的只是
迭代器
方法。所有其他方法(
map
filter
等)都是免费的

class MyIterable[T](xs: Vector[T]) extends Iterable[T] { 
  override def iterator = xs.iterator 
}

val a = new MyIterable(Vector(1,2,3))
a.map(_+1) // res0: Iterable[Int] = List(2, 3, 4)
a.filter(_%2==1) // res1: Iterable[Int] = List(1, 3)

关于枚举数,Scala中有枚举,但使用密封特征+派生类似乎更灵活,例如:

sealed trait MyEnum {
  lazy val value = 0
}
case object MyEnumA extends MyEnum {
  override lazy val value = 1
}
case object MyEnumB extends MyEnum {
  override lazy val value = 2
}

scala> val a = MyEnumB
a: MyEnumB.type = MyEnumB

scala> a.value
res24: Int = 2

scala>  val l = List(MyEnumA,MyEnumB)
l: List[Product with Serializable with MyEnum] = List(MyEnumA, MyEnumB)

scala> l.map(_.value)
res29: List[Int] = List(1, 2)
如果不关心将这些对象映射到除字符串表示以外的任何对象,则也可以在不使用任何内部结构的情况下使用这些对象:

sealed trait MyEnum
case object MyEnumA extends MyEnum
case object MyEnumB extends MyEnum

scala> val a = MyEnumA
a: MyEnumA.type = MyEnumA

scala> a.toString
res21: String = MyEnumA

scala> val l = List(MyEnumA,MyEnumB)
l: List[Product with Serializable with MyEnum] = List(MyEnumA, MyEnumB)

scala> l.map(_.toString)
res30: List[String] = List(MyEnumA, MyEnumB)

该代码的性能负担是什么?意思:需要O(n)时间吗?@StefanKunze,什么需要O(n)时间?当然,比如说,索引查找将是线性的。但这毕竟是可索引的,而不是可索引的。到迭代器的初始转换“转换”到迭代器是常量,因为它不需要转换任何东西。它所要做的就是在每次调用
next
时包装向量并推进索引。