如何实现等效于 JavaIterable<T>
和 C#的 Scala IEnumerable<T>
?基本上,我希望我的集合是可映射的、可过滤的等。集合类应该扩展哪些特征,是否有简单的方法(类似于C#yield return
中的方法yield break
)来创建枚举器?
问问题
6872 次
3 回答
14
实现Iterable
特征。所需要的只是iterator
方法。所有其他方法(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)
于 2013-10-23T21:22:50.477 回答
0
您可以使用scala.collection.Iterable
非常全面和强大的 trait 或其不可变版本。希望这会有所帮助。
于 2013-10-23T21:19:14.987 回答
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)
于 2013-10-23T21:28:48.957 回答