在Dart中Iterable是一个接口,常用的集合类List、Set、Map的遍历都可以通过Iterable来实现。
遍历
void main(){
Iterable<int> a = [4, 5, 6];
// a的类型实际为List<int>,而List为Iterable的子类
print(a.runtimeType);
// foreach遍历
for(var i in a){
print(i);
}
// 简写
a.forEach((element) {print(element);});
}
索引取值
Iterable不支持[index]的方式直接通过索引访问,但可以通过elementAt来访问。此外还提供了first和last的语法糖。
Iterable<int> a = [4, 5, 6];
// 打印4
print(a.elementAt(0));
// 打印4
print(a.first);
// 打印6
print(a.last);
// 打印6
print(a.elementAt(d.length - 1));
// 为空情况
Iterable<int> d = [];
// 异常: RangeError (index): Invalid value: Valid value range is empty: 0
print(d.elementAt(0));
// 异常: Bad state: No element
// 虽然文档上说elementAt(0)和first等效,但在异常处理上还是存在不一致。
print(d.first);
// 异常: Bad state: No element
print(d.last);
// 异常: RangeError (index): Invalid value: Valid value range is empty: -1
print(d.elementAt(d.length - 1));
where、firstWhere、singleWhere
- 可以通过where对数据进行筛选
void main{ Iterable<String> language = ['kotlin', 'java', 'C', 'Dart', 'Python']; // 使用where进行筛选, where中的参数可以通过多种方式传递 // 方式1: 表达式 // var subList = language.where((element) => element.length >= 5); // 方式2: 代码块 // var subList = language.where((element) { // return element.length >= 5; // }); // 方法3: 函数 var subList = language.where(predicate); // 打印kotlin和Python subList.forEach((element) => print(element)); } - firstWhere返回符合条件的第一个元素
可以通过orElse来指定未找到匹配元素的处理var firstElement = language.firstWhere((element) => element.startsWith('D')); // 打印Dart print(firstElement);// 未找到匹配元素 var firstElement = language.firstWhere((element) => element.startsWith('S'), // 未指定则会抛出StateError异常 orElse: ()=>"not found"); // 打印 not found print(firstElement); - singleWhere 返回符合条件的元素,如果符合条件的超过一个,则抛异常
// 返回包含D的元素 var single = language.singleWhere((element) => element.contains('D')); // 打印 Dart print("single:$single"); // 抛出异常: Bad state: Too many elements // var single = language.singleWhere((element) => element.length > 5);
every 和 any
- every表示每个元素都满足条件时返回true,否则返回false
// 是否每个元素的长度都大于1 var result = language.every((element) => element.length > 1); // 打印 false ('C'的长度为1) print(result) - any表示任意元素都满足条件时返回true,否则返回false
var result = language.any((element) => element.length > 2); // 打印true print(result);
takeWhile 和 skipWhile
- takeWhile 表示不满足条件后遍历结束
Iterable<String> language = ['kotlin', 'java', 'C', 'Dart', 'Python']; var subList = language.takeWhile((value) => value!='C'); // 打印 kotlin 和 java subList.forEach((element) => print(element)); - skipWhile 表示从满足条件的元素开始遍历
Iterable<String> language = ['kotlin', 'java', 'C', 'Dart', 'Python']; var subList = language.skipWhile((value) => value=='C'); // 打印 C、 Dart、 Python subList.forEach((element) => print(element));
Mapping
Mapping可以对数据进行转换
var list = [1, 2, 3];
var convertList = list.map((e) => e * 2);
// 打印 4、5、6
convertList.forEach((element) => print(element));
153



被折叠的 条评论
为什么被折叠?



