Dart List - 过滤子类型

时间:2017-04-21 14:43:21

标签: dart

在我的飞镖项目中,构造经常出现在许多情况下。对于具有子类型的类型的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接受此函数。

2 个答案:

答案 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));
}

DartPad example

答案 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);
}