Dart中的集合类型
Dart中常用的集合类型:List、Set、Map。
其中List、Set实现了Iterable类的接口。
Map内部使用了不同的数据结构。但使用Map的entry或values属性,也可以将Map的元素读取为Iterable对象。
关于Iterable。
Iterable是一个可被有序访问的元素的集合。Dart中Iterable是抽象类,是不能被实例化的。但是可以通过List、Set创建Iterable。
Iterable<int> iterable = [1,2,3];
print(iterable.toSet());
print(iterable.toList());
Iterable与List的不同之处在于,Iterable没有[]操作符,因此不能使用如下方式读取特定索引的元素:
var value = iterable[0];//会报错,提示没有[]操作符
但是我们可以用另一种方式来获取:
var value = iterable.elementAt(0);
实现了Iterable的类,都是可以使用for-in循环进行遍历的。for-in通过Iterator(迭代器),遍历Iterable对象。
使用示例:
1. first和last
Iterable<int> iterable = [1,2,3];
iterable.first;
iterable.last;
使用
Iterable的last属性会比较慢,因为它需要遍历所有的元素。当对一个空的Iterable对象使用first和last会报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对象,不会像firstWhere和singleWhere抛StateError异常。
6.takeWhile与skipWhile:
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













网友评论