2013-10-23 8 views
8

JavaのIterable<T>とC#IEnumerable<T>に相当するScalaの実装方法は?基本的には、私のコレクションはマッピング可能でフィルタリング可能なものにしたいと思います。コレクションクラスを拡張する必要があり、列挙子を作成する簡単な方法(C#ではyield returnyield breakなど)Iterableの実装

答えて

13

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) 
+0

そのコードのパフォーマンス負担は?意味:O(n)時間かかりますか? –

+0

@StefanKunze、*何がO(n)時間かかるのですか?もちろん、インデックスルックアップは線形になります。しかし、これは結局のところ、インデックス可能ではありません。 –

+0

イテレータへの最初の変換? –

0

scala.collection.Iterable特性またはその不変のバージョンはかなり包括的で強力です。助けてくれることを願っています。

0

、列挙型は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) 
関連する問題