我有一个简单的类,它扩展了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
由于
答案 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(...))