简介
dart中有四种汇合,别离是Set,List,Map和queues。这些汇合在应用中须要留神些什么呢?什么样的应用才是最好的应用办法呢?一起来看看吧。
应用字面量创立汇合
对于罕用的Set,Map和List三个汇合来说,他们是有本人的无参构造函数的:
factory Set() = LinkedHashSet<E>; external factory Map(); @Deprecated("Use a list literal, [], or the List.filled constructor instead") external factory List([int? length]);
能够看到Set和Map是能够应用构造函数的。然而对于List来说,无参的构造函数曾经不举荐应用了。
对于Set和Map来说,能够这样结构:
var studentMap = Map<String, Student>();var ages = Set<int>();
然而dart官网举荐间接应用字面量来创立这些汇合,如下所示:
var studentMap = <String, Student>{};var ages = <int>{};
为什么呢?这是因为dart中的字面量汇合是十分弱小的。能够通过扩大运算符,if和for语句对汇合进行结构和扩大,如下所示:
var studentList = [ ...list1, student1, ...?list2, for (var name in list3) if (name.endsWith('jack')) name.replaceAll('jack', 'mark')];
不要应用.length来判断汇合是否为空
对应dart的可遍历汇合来说,这些汇合并没有存储汇合的长度信息,所以如果你调用汇合的.length办法,可能会导致汇合的遍历,从而影响性能。
留神Set和List是可遍历的,而Map是不可遍历的。
所以,咱们须要调用汇合的.isEmpty 和 .isNotEmpty办法来判断汇合是否为空,这样速度更快。
if (studentList.isEmpty) print('it is empty');if (studentList.isNotEmpty) print('it is not empty');
可遍历对象的遍历
对应Set和List这两个可遍历的汇合来说,有两种遍历办法,能够通过调用forEach() 办法或者for-in来进行遍历,如下所示:
for (final student in studentList) { ...}
studentList.forEach((student) { ...});
这两种办法中,dart举荐应用for in的写法。
当然,如果你想将现有的function利用在汇合中的每个元素中,forEach也是能够的:
studentList.forEach(print);
留神,因为Map是不可遍历的,所以下面的规定对Map并不实用。
List.from和iterable.toList
可遍历对象能够通过调用toList将其转换成为List,同样的List.from也能够将可遍历对象转换成为List。
那么两者有什么区别呢?
var list1 = iterable.toList();var list2 = List.from(iterable);
两者的区别是iterable.toList并不会扭转list中数据的类型,而List.from会. 举个例子:
// Creates a List<String>:var studentList = ['jack', 'mark', 'alen'];// Prints "List<String>":print(studentList.toList().runtimeType);// Prints "List<dynamic>":print(List.from(studentList).runtimeType);
当然,你也能够应用List<T>.from来强制对创立进去的List进行类型转换。
List<String>.from(studentList)
where和whereType
对于可遍历对象来说,两个过滤汇合中元素的办法,他们是where和whereType。
比方,咱们须要过滤List中的字符串,则能够这样写:
var studentList = ['jack', 'ma', 18, 31];var students1 = studentList.where((e) => e is String);var students2 = studentList.whereType<String>();
看上去两者没有太大的区别,都能够失去应有的后果。然而两者事实上还是有区别的,因为对应where来说,返回的是一个Iterable<Object>
,所以下面的例子中,如果咱们真的须要返回String,还须要对返回后果进行case:
var students1 = studentList.where((e) => e is String).cast<String>();;
所以,如果你要返回特定的对象时候,记得应用whereType。
防止应用cast
cast通常用来对汇合中的元素进行类型转换操作,然而cast的性能比拟低,所以在万不得已的状况下,肯定要防止应用cast。
那么如果不应用cast,咱们怎么对类型进行转换呢?
一个根本的准则就是在构建汇合的时候提前进行类型转换,而不是在构建汇合之后再进行整体的cast。
比方上面的例子从一个dynamic类型的List转换成为int类型的List,那么咱们能够在调用List.from办法的时候进行类型转换:
var stuff = <dynamic>[1, 2];var ints = List<int>.from(stuff);
如果是map的话,能够这样操作:
var stuff = <dynamic>[1, 2];var reciprocals = stuff.map<double>((n) => 1 / n);
比方咱们须要构建一个int的List,那么在创立之初就能够指定List的外部类型,而后再对其增加元素:
List<int> singletonList(int value) { var list = <int>[]; list.add(value); return list;}
总结
以上就是dart中的汇合应用最佳实际。
本文已收录于 http://www.flydean.com/30-dart-collection/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!
欢送关注我的公众号:「程序那些事」,懂技术,更懂你!