实现Iterable

时间:2013-10-23 21:03:12

标签: scala iterable

如何实现Scala等效于Java Iterable<T>和C#IEnumerable<T>?基本上,我希望我的集合是可映射的,可过滤的等等。集合类应该扩展哪些特性并且有简单的方法(如C#中的yield returnyield break之类的东西来创建枚举器?

3 个答案:

答案 0 :(得分:14)

实施Iterable特质。所需要的只是iterator方法。所有其他方法(mapfilter等)都是免费的。

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)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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)