Руководство Dart List
1. List<E>
В большинстве языков программирования массив является незаменимым понятием. Однако язык программирования Dart не имеет традиционной концепции массива. Вместо этого он использует List (список) с аналогичными функциями и добавляет новые.
Ниже приведены характеристики of List:
- Как и традиционные массивы, List содержит упорядоченные элементы и индексируется, начиная с 0.
- В зависимости от типа создаваемого List его размер фиксирован или при необходимости может быть автоматически увеличен.
abstract class List<E> implements EfficientLengthIterable<E>
- Iterable
- Map
- DoubleLinkedQueue
- IterableBase
- IterableMixin
- LinkedList
- ListQueue
- Queue
- Set
- Runes
2. Constructors
List - это класс, поэтому по обычному смыслу, для создания объекта вам необходимо использовать его constructor или предоставленный статический фабричный метод.
Конструкторы:
@Deprecated("Use a list literal, [], or the List.filled constructor instead")
external factory List([int? length]);
external factory List.filled(int length, E fill, {bool growable = false});
@Since("2.9")
external factory List.empty({bool growable = false});
external factory List.from(Iterable elements, {bool growable = true});
external factory List.of(Iterable<E> elements, {bool growable = true});
external factory List.generate(int length, E generator(int index), {bool growable = true});
external factory List.unmodifiable(Iterable elements);
List([int?])
Constructor List([int?]) устарел (deprecated) и был заменен тем же синтаксисом, что и при традиционном создании массива:
list_ex1.dart
var foo1 = List<String>(); // Deprecated (error)
var bar1 = List<String>(n); // Deprecated (error)
var baz1 = List<String>(0); // Deprecated (error)
List<int> foo2 = List<int>(); // Deprecated (error)
List<int> bar2 = List<int>(n); // Deprecated (error)
List<int> baz2 = List<int>(0); // Deprecated (error)
var foo3 = []; // OK
var bar3 = ["One", "Two"]; // OK
var foo4 = <String>[]; // OK
var bar4 = <String>["One", "Two"]; // OK
List<String> foo5 = []; // OK
List<String> bar6 = ["One", "Two"]; // OK
List<String> foo7 = <String>[]; // OK
List<String> bar7 = <String>["One", "Two"]; // OK
List.filled
external factory List.filled(int length, E fill, {bool growable = false});
Например: Создайте растущий (growable) List , содержащий 5 элементов, все элементы Foo":
var list1 = List<String>.filled(5, 'Foo', growable: true);
var list2 = List.filled(5, 'Foo', growable: true);
List<String> list3 = List.filled(5, 'Foo', growable: true);
List.empty
@Since("2.9")
external factory List.empty({bool growable = false});
Создайте пустой List, который может увеличиваться (growable) в размерах.
var list1 = List<String>.empty(growable: true);
var list2 = List.empty(growable: true);
List<String> list3 = List.empty(growable: true);
// Same as:
var list4 = <String>[];
List<String> list5 = [];
List.of
external factory List.of(Iterable<E> elements, {bool growable = true});
Создаем объект List, содержащий все элементы объекта Iterable.
list_of_ex1.dart
import 'dart:collection';
void main() {
// A collection containing non-duplicate elements
var iterator = Set<String>.identity();
iterator.add('Tom');
iterator.add('Jerry');
iterator.add('Donald');
var list = List<String>.of(iterator, growable: true);
print(list); // [Tom, Jerry, Donald]
}
List.from
external factory List.from(Iterable elements, {bool growable = true});
Создаем объект List, содержащий все элементы объекта Iterable. Этот конструктор похож на List.of, но у него нет возможности самостоятельно проверять входные данные of Iterable, поэтому он может вызывать ошибки во время выполнения программы.
Например:
list_from_ex1.dart
void main() {
// A collection containing non-duplicate elements
var iterator = Set<dynamic>.identity(); // Any data type
iterator.add('Tom'); // String data type
iterator.add('Jerry'); // String data type
iterator.add(1000); // int data type
var list = List<String>.from(iterator, growable: true); // Compile OK!! but Error at runtime.
print(list);
}
Output:
Unhandled exception:
type 'int' is not a subtype of type 'String'
#0 new List.from (dart:core-patch/array_patch.dart:40:5)
#1 main
bin/list_from_ex1.dart:10
#2 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:283:19)
#3 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12)
List.generate
external factory List.generate(int length, E generator(int index), {bool growable = true});
Возвращает список элементов [length] с элементами, сгенерированными указанной функцией.
Например: Создаем List из 5 элементов, элементы генерируются на основе их индексов.
list_generate_ex1.dart
import 'dart:collection';
void main() {
// Create a Clousure (Function)
var generator = (index) {
return 'Element $index';
};
var list = List<String>.generate(5, generator, growable: true );
print(list); // [Element 0, Element 1, Element 2, Element 3, Element 4]
}
List.unmodifiable
external factory List.unmodifiable(Iterable elements);
3. Operators
Операторы of List:
E operator [](int index);
void operator []=(int index, E value);
bool operator ==(Object other);
List<E> operator +(List<E> other);
4. Properties
Свойства of List:
void set first(E value);
void set last(E value);
int get length;
set length(int newLength);
Iterable<E> get reversed;
5. Methods
Методы of List:
static List<T> castFrom<S, T>(List<S> source) => CastList<S, T>(source);
static void copyRange<T>(List<T> target, int at, List<T> source, [int? start, int? end])
static void writeIterable<T>(List<T> target, int at, Iterable<T> source);
void add(E value);
void addAll(Iterable<E> iterable);
List<R> cast<R>();
void sort([int compare(E a, E b)?]);
void shuffle([Random? random]);
int indexOf(E element, [int start = 0]);
int indexWhere(bool test(E element), [int start = 0]);
int lastIndexWhere(bool test(E element), [int? start]);
int lastIndexOf(E element, [int? start]);
void clear();
void insert(int index, E element);
void insertAll(int index, Iterable<E> iterable);
void setAll(int index, Iterable<E> iterable);
bool remove(Object? value);
E removeAt(int index);
E removeLast();
void removeWhere(bool test(E element));
void retainWhere(bool test(E element));
List<E> sublist(int start, [int? end]);
Iterable<E> getRange(int start, int end);
void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]);
void removeRange(int start, int end);
void fillRange(int start, int end, [E? fillValue]);
void replaceRange(int start, int end, Iterable<E> replacements);
Map<int, E> asMap();
6. asMap()
Map<int, E> asMap();
Возвращает неизменяемый (unmodifiable) объект Map<int,E> со значениями 0, 1, 2.. в качестве ключей и элементов списка в качестве значений.
list_asMap_ex1.dart
void main() {
var list = <String>['Tom', 'Jerry', 'Donald'];
Map<int,String> map = list.asMap();
for(var idx in map.keys) {
print('idx: $idx --> ${map[idx]}');
}
}
Output:
idx: 0 --> Tom
idx: 1 --> Jerry
idx: 2 --> Donald
7. cast<R>()
List<R> cast<R>();
Возвращает представление этого List<E> в виде List<R>.
Например:
list_cast_ex1.dart
class Person {}
class Employee extends Person {
String name;
Employee(this.name);
}
void main() {
var p1 = Employee('Jennifer');
var p2 = Employee('James');
var p3 = Employee('John');
var list = <Person>[p1, p2, p3]; // List<Person>
var empList = list.cast<Employee>(); // List<Employee>
for (var emp in empList) {
print(emp.name);
}
}
Output:
Jennifer
James
John
8. castFrom<S, T>(..)
static List<T> castFrom<S, T>(List<S> source) => CastList<S, T>(source);
Статический метод, который возвращает представление указанного List<S> в виде List<R>.
Например:
list_castFrom_ex1.dart
class Person {}
class Employee extends Person {
String name;
Employee(this.name);
}
void main() {
var p1 = Employee('Jennifer');
var p2 = Employee('James');
var p3 = Employee('John');
var personList = <Person>[p1, p2, p3]; // List<Person>
var empList = List.castFrom<Person, Employee>(personList); // List<Employee>
for (var emp in empList) {
print(emp.name);
}
}
Output:
Jennifer
James
John
9. copyRange<T>(..)
static void copyRange<T>(List<T> target, int at, List<T> source, [int? start, int? end])
Замените элементы из индекса [at] of List элементами из индекса [start] в [end-1] of Iterable.
Этот метод может вызвать ошибку RangeError, если:
end - start + at > target.length
Например:
list_copyRange_ex1.dart
void main() {
var sourceList = <String>['Zero', 'One', 'Two', 'Three'];
var targetList = <String>['0', '1', '2', '3', '4', '5'];
List.copyRange(targetList, 2, sourceList, 1, 3);
print(targetList);
}
Output:
[0, 1, One, Two, 4, 5]
10. fillRange(..)
void fillRange(int start, int end, [E? fillValue]);
Замените все элементы от индекса [start] до [end-1] на [fillValue].
Например:
list_fillRange_ex1.dart
void main() {
var flowers = <String>['Rose', 'Lily', 'Sunflower', 'Lotus', 'Water Lily', 'Marigold', 'Lavender'];
print(flowers);
print(' -- fillRange from index 2 to 5 -- ');
flowers.fillRange(2, 5, 'A');
print(flowers);
}
Output:
[Rose, Lily, Sunflower, Lotus, Water Lily, Marigold, Lavender]
-- fillRange from index 2 to 5 --
[Rose, Lily, A, A, A, Marigold, Lavender]
11. indexWhere(..)
int indexWhere(bool test(E element), [int start = 0]);
Возвращает индекс первого элемента, прошедшего указанный тест.
Например:
list_indexWhere_ex1.dart
void main() {
var flowers = <String>['Rose', 'Lily', 'Sunflower', 'Lotus', 'Water Lily', 'Marigold', 'Lavender'];
var test = (String element) => element.contains('L'); // A Closure.
var index = flowers.indexWhere((element) => element.contains('L'), 2);
print('index found: $index --> ${flowers[index]}'); // 3 --> Lotus
}
Output:
index found: 3 --> Lotus
12. insertAll(..)
void insertAll(int index, Iterable<E> iterable);
Вставьте все элементы of Iterable в этот List по индексу [index].
Например:
list_insertAll_ex1.dart
void main() {
var flowers = <String>['Rose', 'Lily', 'Sunflower', 'Lotus', 'Snowdrop', 'Marigold', 'Lavender'];
print(flowers);
Iterable<String> iterable = ['A', 'B', 'C'];
flowers.insertAll(2, iterable);
print(' --- After insertAll --- ');
print(flowers);
}
Output:
[Rose, Lily, Sunflower, Lotus, Snowdrop, Marigold, Lavender]
--- After insertAll ---
[Rose, Lily, A, B, C, Sunflower, Lotus, Snowdrop, Marigold, Lavender]
13. removeWhere(..)
void removeWhere(bool test(E element));
Удаляет все элементы, прошедшие указанный тест.
Например:
list_removeWhere_ex1.dart
void main() {
var flowers = <String>['Rose', 'Lily', 'Sunflower', 'Lotus', 'Water Lily', 'Marigold', 'Lavender'];
print(flowers);
var test = (String element) { // A Closure.
return element.contains('L') || element.contains('R');
};
flowers.removeWhere(test);
print(' -- after removing -- ');
print(flowers);
}
Output:
[Rose, Lily, Sunflower, Lotus, Water Lily, Marigold, Lavender]
-- after removing --
[Sunflower, Marigold]
14. replaceRange(..)
void replaceRange(int start, int end, Iterable<E> replacements);
Заменяет элементы из индекса [start] на [end-1] этого List элементами указанной Iterable.
Например:
list_replaceRange_ex1.dart
void main() {
var flowers = <String>['Rose', 'Lily', 'Sunflower', 'Lotus', 'Water Lily', 'Marigold', 'Lavender'];
print(flowers);
print(' -- Replace elements from index 2 to 5 -- ');
var iterable = ['A', 'B']; // Note: List is subclass of Iterable.
flowers.replaceRange(2, 5, iterable);
print(flowers); // [Rose, Lily, A, B, Marigold, Lavender]
}
Output:
[Rose, Lily, Sunflower, Lotus, Water Lily, Marigold, Lavender]
-- Replace elements from index 2 to 5 --
[Rose, Lily, A, B, Marigold, Lavender]
- Dart Iterable
15. retainWhere(..)
void retainWhere(bool test(E element));
Удаляет все элементы, которые не прошли указанный тест.
Например:
list_retainWhere_ex1.dart
void main() {
var flowers = <String>['Rose', 'Lily', 'Sunflower', 'Lotus', 'Snowdrop', 'Marigold', 'Lavender'];
print(flowers);
var test = (String element) => element.startsWith('S'); // A Clousure.
flowers.retainWhere(test);
print(flowers);
}
Output:
[Rose, Lily, Sunflower, Lotus, Snowdrop, Marigold, Lavender]
-- fillRange from index 2 to 5 --
[Sunflower, Snowdrop]
16. setAll(..)
void setAll(int index, Iterable<E> iterable);
Заменяет элементы из индекса [index] этого List элементами указанной Iterable.
Этот метод вызовет ошибку RangeError, если:
iterable.length + index > thisList.length
Например:
list_setAll_ex1.dart
void main() {
var flowers = <String>['Rose', 'Lily', 'Sunflower', 'Lotus', 'Snowdrop', 'Marigold', 'Lavender'];
print(flowers);
Iterable<String> iterable = ['A', 'B', 'C'];
flowers.setAll(2, iterable);
print(' --- After setAll --- ');
print(flowers);
}
Output:
[Rose, Lily, Sunflower, Lotus, Snowdrop, Marigold, Lavender]
--- After setAll ---
[Rose, Lily, A, B, C, Marigold, Lavender]
17. shuffle([Random? random])
void shuffle([Random? random]);
Случайным образом перемешивает элементы этого списка.
list_shuffle_ex1.dart
import 'dart:math';
void main() {
var list = <int>[1, 2, 3, 4, 5, 6,7];
list.shuffle(); //
print(list);
var random = Random(5); // seed = 5
list.shuffle(random);
print(list);
}
Output:
[4, 2, 5, 6, 7, 3, 1]
[3, 7, 6, 2, 5, 4, 1]
18. writeIterable<T>(..)
static void writeIterable<T>(List<T> target, int at, Iterable<T> source);
Замените элементы из индекса [at] of List элементами of Iterable.
Этот метод вызовет ошибку RangeError, если:
source.length + at > target.length
Например:
list_writeIterable_ex1.dart
void main() {
// Note: List is subclass of Iterable.
Iterable<String> sourceIterable = <String>['Zero', 'One', 'Two', 'Three'];
var targetList = <String>['0', '1', '2', '3', '4', '5', '6', '7'];
List.writeIterable(targetList, 2, sourceIterable);
print(targetList);
}
Output:
[0, 1, Zero, One, Two, Three, 6, 7]
Pуководства Dart
- Тип данных Boolean в Dart
- Функции в Dart
- Замыкания (Closure) в Dart
- Методы в Dart
- Свойства в Dart
- Оператор точка-точка (..) в Dart
- Программирование Dart с помощью онлайн-инструмента DartPad
- Установите Dart SDK в Windows
- Установите Visual Studio Code в Windows
- Установите Dart Code Extension для Visual Studio Code
- Установите Dart Plugin для Android Studio
- Запустите свой первый пример Dart в Visual Studio Code
- Запустите свой первый пример Dart в Android Studio
- Dart JSON với thư viện dart:convert
- Руководство Dart List
- Переменные в Dart
- Руководство Dart Map
- Циклы в Dart
Show More