关于flutter:dart系列之集合使用最佳实践

2次阅读

共计 2681 个字符,预计需要花费 7 分钟才能阅读完成。

简介

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/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

欢送关注我的公众号:「程序那些事」, 懂技术,更懂你!

正文完
 0