美文网首页
Dart基础:可迭代的集合

Dart基础:可迭代的集合

作者: 沐灵洛 | 来源:发表于2020-06-17 17:14 被阅读0次

    Dart中的集合类型

    Dart中常用的集合类型:ListSetMap
    其中ListSet实现了Iterable类的接口。
    Map内部使用了不同的数据结构。但使用Mapentryvalues属性,也可以将Map的元素读取为Iterable对象。

    关于Iterable

    Iterable是一个可被有序访问的元素的集合。Dart中Iterable是抽象类,是不能被实例化的。但是可以通过ListSet创建Iterable

    Iterable<int> iterable = [1,2,3];
    print(iterable.toSet());
    print(iterable.toList());
    

    IterableList的不同之处在于,Iterable没有[]操作符,因此不能使用如下方式读取特定索引的元素:

    var value = iterable[0];//会报错,提示没有[]操作符
    

    但是我们可以用另一种方式来获取:

    var value = iterable.elementAt(0);
    

    实现了Iterable的类,都是可以使用for-in循环进行遍历的。for-in通过Iterator(迭代器),遍历Iterable对象。

    使用示例:

    1. firstlast

    Iterable<int> iterable = [1,2,3];
    iterable.first;
    iterable.last;
    

    使用Iterablelast属性会比较慢,因为它需要遍历所有的元素。当对一个空的Iterable对象使用firstlast会报StateError

    var iterable = [];
    print('The first element is ${iterable.first}');
    print('The last element is ${iterable.last}');
    //提示:Uncaught Error: Bad state: No element
    

    2.firstWhere
    Iterable的对象中,获取满足条件的第一个元素。

    Iterable<int> iterable = {-1,0,1,2};
    //找到返回,找不到返回orElse的值。orElse可选参数。
    int negtive = iterable.firstWhere((item)=> item < 0,orElse: ()=>99);
    print(negtive);//-1
    

    如果firstWhere没有找到,并且orElse参数被忽略,则会抛出StateError

    3.singleWhere:
    Iterable的对象中,获取满足条件的一个元素,但它只期望只有一个元素满足条件。如果超过一个或没有元素满足条件,则会抛StateError。用法与firstWhere一致。

    singleWhere()单步执行Iterable对象直到最后一个元素,如果Iterable无限或包含大量元素,可能会导致问题。

    4.条件检查
    使用Iterable,有时需要校验集合中的元素是否满足一些条件,可以不使用for-in
    Dart提供了every方法:
    来判断是否所有的元素都满足某个条件

     Iterable<int> iterable = {-1,0,1,2};
    bool satisfy = iterable.every((item)=> item > 2);//是否所有元素都满足>2
    

    Dart提供了any方法:
    来判断是否至少有一个元素满足某个条件。

    Iterable<int> iterable = {-1,0,1,2};
    //是否至少有一个元素满足>=2
    bool satisfy = iterable.any((item)=> item >= 2);
    

    5.where:
    返回满足条件的所有元素集合。

    Iterable<int> iterable = {-1,0,1,2};
    var evenNumbers = iterable.where((number) => number.isEven);
    

    使用where未过滤到满足条件的集合时,会返回空的Iterable对象,不会像firstWheresingleWhereStateError异常。

    6.takeWhileskipWhile

    takeWhile会从Iterable对象中获取所有满足条件的元素,直到不满足时,会跳出迭代。

    Iterable<int> iterable = {-2,-1,0,1,2};
    //类似do While 满足时获取,不满足停止迭代
    var  value = iterable.takeWhile((item)=>item.isNegative);
    print(value);//输出(-2, -1)
    

    skipWhile会从Iterable对象中跳过所有满足条件的元素,直到不满足时,会获取。

    Iterable<int> iterable = {-2,-1,0,1,2};
    //类似do While 满足时跳过,不满足时获取
    var  value = iterable.skipWhile((item)=>item.isNegative);
    print(value);//输出(0, 1, 2)
    

    7. map:
    Iterable对象可以使用map方法,对集合中的每个元素进行操作或替换,最终返回一个新的集合。

    //操作
    Iterable<int> output = numbers.map((number) => number * 10);
    //替换
    Iterable<String> output = numbers.map((number) => number.toString());
    

    参考资料:
    Dart-Language-Tour

    相关文章

      网友评论

          本文标题:Dart基础:可迭代的集合

          本文链接:https://www.haomeiwen.com/subject/vcwightx.html