在我的飞镖项目中,构造经常出现在许多情况下。对于具有子类型的类型的List,此代码将子类型过滤为新列表:
class A {
}
class AChild extends A {
}
List<A> alist = [new A(), new AChild()];
List<AChild> aclist = alist.where((final A a) => a is AChild).
map((final A a) => a as AChild).toList();
没什么大不了的,事情还可以。所以我只是搜索一下。这可以用功能或更紧凑的东西取代吗?尝试使用List和泛型类型编写函数,但不要让is
接受此函数。
答案 0 :(得分:1)
不确定你是否会认为这更短。如果经常使用此模式,则可能是:
class CheckType<T> {
bool isT(dynamic v) => v is T;
T as(dynamic v) => v as T;
}
main() {
final ct = new CheckType<AChild>();
List<A> alist = [new A(), new AChild()];
List<AChild> aclist = new List<AChild>.from(alist.where(ct.isT).(ct.as));
}
答案 1 :(得分:0)
根据Günter的提示,使用工具类而不是函数。如果经常发生过滤器类可以在项目中保持不变,那么很好。得到以下:
class A {}
class AChild extends A {}
class TypeFilter<T, Z>{
const TypeFilter();
List<T> list(List<Z> lz){
return lz.where((final Z z) => z is T)
.map((final Z z) => z as T).toList();
}
}
main(List<String> args) {
const TypeFilter filterAChild = const TypeFilter<AChild, A>();
List<A> alist = [new A(), new AChild()];
List<AChild> aclist = filterAChild.list(alist);
print(aclist);
}