过滤后创建实例类型

时间:2015-01-03 20:21:36

标签: scala scala-collections extends

我有一个简单的类,它扩展了IndexedSeq [MyType]

class MyClass(someName: String, values: Iterable[MyType]) extends IndexedSeq[MyType] {
  val name = someName
  val rows = values.toVector
  ....
}

这很好用,允许我调用此对象上的所有标准集合方法,过滤,映射等,并将结果作为IndexedSeq [MyType]返回给我。

我希望结果作为MyClass的新实例返回,或者是这样做的样板文件,所以每次创建新的MyClass时我都不需要额外的手动步骤。 EG:

val results = myClassInstance.filter(t => t)
val newMyClass = new MyClass(myClassInstance.name, results)

是否有任何简化和执行以下操作的方法,因为我需要访问原始的myClassInstance以将名称值从中复制到新对象。

val newMyClass = myClassInstance.filter(t => t).toMyClass

由于

2 个答案:

答案 0 :(得分:1)

我通过扩展IndexedSeqLike[DataRow, DataView]并在随播对象中实现构建器来找出解决方案。到目前为止,这似乎完全符合我的要求而不需要通过电话。

class MyClass(someName: String, values: Iterable[MyType]) 
  extends IndexedSeq[MyType] 
  with IndexedSeqLike[MyType, MyClass] {

  val name = someName
  val rows = values.toVector

  // Supply a builder method which will get used on filter, reverse etc,
  override def newBuilder: mutable.Builder[MyType, MyClass] =
    MyClass.newBuilder(name)

  ....
}

然后在随播对象中添加以下内容......

object MyClass {

  // Builder for a new MyClass instance.
  def newBuilder(name: String): mutable.Builder[MyType, MyClass] =
    Vector.newBuilder[MyType] mapResult (vector => new MyClass(name, vector))
}

现在按要求开展以下工作:

val filteredData: MyClass = myClass.filter(f => f)
val reversedData: MyClass = myClass.reverse

答案 1 :(得分:0)

您确定需要继承IndexedSeq吗?

如果您只需要过滤器&您的类中的 map 函数,您可以实现它们,而无需覆盖IndexedSeq

class MyClass(name: String, values: Iterable[MyType]) {

    def filter(f: MyType => Boolean): MyClass = {
        new MyClass(name, values.filter(f))
    }

    def map(f: MyType => MyType): MyClass = {
        new MyClass(name, values.map(f))
    }

}

或者如果你真的需要覆盖IndexedSeq,你可以在你的类中添加显式过滤方法

class MyClass(name: String, values: Iterable[MyType]) extends IndexedSeq[MyClass] {

    def filterClass(f: MyType => Boolean): MyClass = {
        new MyClass(name, values.filter(f))
    }

}

或其他选项

class MyClass(name: String, values: Iterable[MyType]) extends IndexedSeq[MyClass] {

    def copyWith(f: Iterable[MyType] => Iterable[MyType]): MyClass = {
        new MyClass(name, f(values))
    }

}

MyClass.copyWith(_.filter(...))
MyClass.copyWith(_.filterNot(...))
MyClass.copyWith(_.map(...))