当前位置:网站首页>Dart series: collection of best practices

Dart series: collection of best practices

2022-07-05 02:47:00 Procedures, those things

brief introduction

dart There are four sets in , Namely Set,List,Map and queues. What should we pay attention to when using these sets ? What kind of use is the best way to use it ? Let's see .

Create a collection with literal

For commonly used Set,Map and List For three sets , They have their own parameterless constructors :

  factory Set() = LinkedHashSet<E>;
  external factory Map();

  @Deprecated("Use a list literal, [], or the List.filled constructor instead")
  external factory List([int? length]);

You can see Set and Map You can use constructors . But for List Come on , Parameterless constructors are no longer recommended .

about Set and Map Come on , It can be structured like this :

var studentMap = Map<String, Student>();
var ages = Set<int>();

however dart The official recommendation is to use literal values directly to create these collections , As shown below :

var studentMap = <String, Student>{};
var ages = <int>{};

Why? ? This is because dart The literal set in is very powerful . You can extend the operator ,if and for Statement to construct and extend a collection , As shown below :

var studentList = [
  ...list1,
  student1,
  ...?list2,
  for (var name in list3)
    if (name.endsWith('jack'))
      name.replaceAll('jack', 'mark')
];

Do not use .length To determine if the set is empty

Corresponding dart For the ergodic set of , These sets do not store the length information of the set , So if you call the of the collection .length Method , It may lead to traversal of the collection , Which affects performance .

Be careful Set and List It's ergodic , and Map It's not ergodic .

therefore , We need to call the... Of the collection .isEmpty and .isNotEmpty Method to determine whether the collection is empty , It's faster .

if (studentList.isEmpty) print('it is empty');
if (studentList.isNotEmpty) print('it is not empty');

Traversal of traversable objects

Corresponding Set and List For these two traversable sets , There are two ways to traverse , You can call forEach() Methods or for-in Let's do the traversal , As shown below :

for (final student in studentList) {
  ...
}
studentList.forEach((student) {
  ...
});

Of these two methods ,dart Recommended for in Writing .

Of course , If you want to put the existing function Apply to each element in the collection ,forEach It's OK, too :

studentList.forEach(print);

Be careful , because Map It's not ergodic , So the above rule is right Map Not applicable .

List.from and iterable.toList

Traversable objects can be accessed by calling toList Turn it into List, alike List.from You can also convert traversable objects into List.

So what's the difference between the two ?

var list1 = iterable.toList();
var list2 = List.from(iterable);

The difference between the two iterable.toList It doesn't change list The type of data in , and List.from Meeting . for instance :

// Creates a List<String>:
var studentList = ['jack', 'mark', 'alen'];

// Prints "List<String>":
print(studentList.toList().runtimeType);

// Prints "List<dynamic>":
print(List.from(studentList).runtimeType);

Of course , You can also use List .from To force the creation of List Do type conversion .

List<String>.from(studentList)

where and whereType

For traversable objects , Two methods of filtering elements in a collection , They are where and whereType.

such as , We need to filter List String in , You can write like this :

var studentList = ['jack', 'ma', 18, 31];
var students1 = studentList.where((e) => e is String);
var students2 = studentList.whereType<String>();

It seems that there is not much difference between the two , Can get the results they deserve . But the two are actually different , Because it corresponds to where Come on , Back to a Iterable, So in the example above , If we really need to go back String, The returned results also need to be case:

var students1 = studentList.where((e) => e is String).cast<String>();;

therefore , If you want to return a specific object , Remember to use whereType.

Avoid using cast

cast It is usually used for type conversion of elements in a collection , however cast The performance is relatively low , So as a last resort , Be sure to avoid using cast.

So if you don't use cast, How do we convert types ?

A basic principle is to convert types in advance when building collections , Instead of building a collection and then doing an overall cast.

For example, the following example is from a dynamic Type of List Convert into int Type of List, So we can call List.from Method to perform type conversion :

var stuff = <dynamic>[1, 2];
var ints = List<int>.from(stuff);

If it is map Words , You can do this :

var stuff = <dynamic>[1, 2];
var reciprocals = stuff.map<double>((n) => 1 / n);

For example, we need to build a int Of List, Then you can specify... At the beginning of creation List Internal type of , Then add elements to it :

List<int> singletonList(int value) {
  var list = <int>[];
  list.add(value);
  return list;
}

summary

That's all dart Collections in use best practices .

This article has been included in http://www.flydean.com/30-dart-collection/

The most popular interpretation , The deepest dry goods , The most concise tutorial , There are so many tricks you don't know about waiting for you to discover !

Welcome to my official account. :「 Program those things 」, Know technology , Know you better !

原网站

版权声明
本文为[Procedures, those things]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/02/202202140854061225.html