List<E> abstract class
A List is an indexable collection with a length.
A List implementation can choose not to support all methods
of the List interface.
The most common list types are: Fixed length list. It is an error to use operations that can change the list's length. Growable list. Full implementation of the interface. * Unmodifiable list. It is an error to use operations that can change the list's length, or that can change the values of the list. If an unmodifable list is backed by another modifiable data structure, the values read from it may still change over time.
Example:
var fixedLengthList = new List(5);
fixedLengthList.length = 0; // throws.
fixedLengthList.add(499); // throws
fixedLengthList[0] = 87;
var growableList = [1, 2];
growableList.length = 0;
growableList.add(499);
growableList[0] = 87;
var unmodifiableList = const [1, 2];
unmodifiableList.length = 0; // throws.
unmodifiableList.add(499); // throws
unmodifiableList[0] = 87; // throws.
Lists are Iterable. List iteration iterates over values in index order. Changing the values will not affect iteration, but changing the valid indices - that is, changing the list's length - between iteration steps will cause a ConcurrentModificationError. This means that only growable lists can throw ConcurrentModificationError. If the length changes temporarily and is restored before continuing the iteration, the iterator will not detect it.
abstract class List<E> implements Iterable<E> {
/**
* Creates a list of the given [length].
*
* The list is a fixed-length list if [length] is provided, and an empty
* growable list if [length] is omitted.
*
* It is an error if [length] is not a non-negative integer.
*/
external factory List([int length]);
/**
* Creates a fixed-length list of the given [length] where each entry
* contains [fill].
*/
external factory List.filled(int length, E fill);
/**
* Creates an list with the elements of [other].
*
* The order in the list will be
* the order provided by the iterator of [other].
*
* The returned list is growable if [growable] is true, otherwise it's
* a fixed length list.
*/
factory List.from(Iterable other, { bool growable: true }) {
List<E> list = new List<E>();
for (E e in other) {
list.add(e);
}
if (growable) return list;
int length = list.length;
List<E> fixedList = new List<E>(length);
for (int i = 0; i < length; i++) {
fixedList[i] = list[i];
}
return fixedList;
}
/**
* Generate a `List` of values.
*
* Creates a list with [length] positions
* and fills them by values created by calling [generator]
* for each index in the range `0` .. `[length] - 1`
* in increasing order.
*
* The created list's length is fixed unless [growable] is true.
*/
factory List.generate(int length, E generator(int index),
{ bool growable: true }) {
List<E> result;
if (growable) {
result = <E>[]..length = length;
} else {
result = new List<E>(length);
}
for (int i = 0; i < length; i++) {
result[i] = generator(i);
}
return result;
}
/**
* Returns the element at the given [index] in the list or throws
* an [RangeError] if [index] is out of bounds.
*/
E operator [](int index);
/**
* Sets the entry at the given [index] in the list to [value].
*
* Throws an [RangeError] if [index] is out of bounds.
*/
void operator []=(int index, E value);
/**
* Returns the number of elements in the list.
*
* The valid indices for a list are 0 through `length - 1`.
*/
int get length;
/**
* Changes the length of the list. If [newLength] is greater than
* the current [length], entries are initialized to [:null:].
*
* Throws an [UnsupportedError] if the list is not extendable.
*/
void set length(int newLength);
/**
* Adds [value] at the end of the list, extending the length by
* one.
*
* Throws an [UnsupportedError] if the list is not extendable.
*/
void add(E value);
/**
* Appends all elements of the [iterable] to the end of this list.
*
* Extends the length of the list by the number of elements in [iterable].
* Throws an [UnsupportedError] if this list is not extensible.
*/
void addAll(Iterable<E> iterable);
/**
* Returns an [Iterable] of the elements of this [List] in reverse order.
*/
Iterable<E> get reversed;
/**
* Sorts the list according to the order specified by the [compare] function.
*
* The [compare] function must act as a [Comparator].
*
* The default [List] implementations use [Comparable.compare] if
* [compare] is omitted.
*/
void sort([int compare(E a, E b)]);
/**
* Returns the first index of [element] in the list.
*
* Searches the list from index [start] to the length of the list.
* The first time an element [:e:] is encountered so that [:e == element:],
* the index of [:e:] is returned.
* Returns -1 if [element] is not found.
*/
int indexOf(E element, [int start = 0]);
/**
* Returns the last index of [element] in the list.
*
* Searches the list backwards from index [start] (inclusive) to 0.
*
* The first time an element [:e:] is encountered so that [:e == element:],
* the index of [:e:] is returned.
*
* If start is not provided, it defaults to [:this.length - 1:].
*
* Returns -1 if [element] is not found.
*/
int lastIndexOf(E element, [int start]);
/**
* Removes all elements in the list.
*
* The length of the list becomes zero.
*
* Throws an [UnsupportedError], and retains all elements, if the
* length of the list cannot be changed.
*/
void clear();
/**
* Inserts the element at position [index] in the list.
*
* This increases the length of the list by one and shifts all elements
* at or after the index towards the end of the list.
*
* It is an error if the [index] does not point inside the list or at the
* position after the last element.
*/
void insert(int index, E element);
/**
* Inserts all elements of [iterable] at position [index] in the list.
*
* This increases the length of the list by the length of [iterable] and
* shifts all later elements towards the end of the list.
*
* It is an error if the [index] does not point inside the list or at the
* position after the last element.
*/
void insertAll(int index, Iterable<E> iterable);
/**
* Overwrites elements of `this` with the elemenst of [iterable] starting
* at position [index] in the list.
*
* This operation does not increase the length of `this`.
*
* It is an error if the [index] does not point inside the list or at the
* position after the last element.
*
* It is an error if the [iterable] is longer than [length] - [index].
*/
void setAll(int index, Iterable<E> iterable);
/**
* Removes [value] from the list. Returns true if [value] was
* in the list. Returns false otherwise. The method has no effect
* if [value] value was not in the list.
*/
bool remove(Object value);
/**
* Removes the element at position [index] from the list.
*
* This reduces the length of `this` by one and moves all later elements
* down by one position.
*
* Returns the removed element.
*
* Throws an [ArgumentError] if [index] is not an [int].
*
* Throws an [RangeError] if the [index] does not point inside
* the list.
*
* Throws an [UnsupportedError], and doesn't remove the element,
* if the length of `this` cannot be changed.
*/
E removeAt(int index);
/**
* Pops and returns the last element of the list.
* Throws a [UnsupportedError] if the length of the
* list cannot be changed.
*/
E removeLast();
/**
* Removes all elements of this list that satisfy [test].
*
* An elements [:e:] satisfies [test] if [:test(e):] is true.
*/
void removeWhere(bool test(E element));
/**
* Removes all elements of this list that fail to satisfy [test].
*
* An elements [:e:] satisfies [test] if [:test(e):] is true.
*/
void retainWhere(bool test(E element));
/**
* Returns a new list containing the elements from [start] to [end].
*
* If [end] is omitted, the [length] of `this` is used.
*
* It is an error if [start] or [end] are not indices into `this`,
* or if [end] is before [start].
*/
List<E> sublist(int start, [int end]);
/**
* Returns an [Iterable] that iterators over the elements in the range
* [start] to [end] exclusive. The result of this function
* is backed by `this`.
*
* It is an error if [end] is before [start].
*
* It is an error if the [start] and [end] are not valid ranges at the time
* of the call to this method. The returned [Iterable] behaves similar to
* `skip(start).take(end - start)`. That is, it will not throw exceptions
* if `this` changes size.
*
* Example:
*
* var list = [1, 2, 3, 4, 5];
* var range = list.getRange(1, 4);
* print(range.join(', ')); // => 2, 3, 4
* list.length = 3;
* print(range.join(', ')); // => 2, 3
*/
Iterable<E> getRange(int start, int end);
/**
* Copies the elements of [iterable], skipping the [skipCount] first elements,
* into the range [start] to [end] exclusive of `this`.
*
* If [start] equals [end] and [start]..[end] represents a legal range, this
* method has no effect.
*
* It is an error if [start]..[end] is not a valid range pointing into the
* `this`.
*
* It is an error if the [iterable] does not have enough elements after
* skipping [skipCount] elements.
*
* Example:
*
* var list = [1, 2, 3, 4];
* var list2 = [5, 6, 7, 8, 9];
* list.setRange(1, 3, list2, 3);
* print(list); // => [1, 8, 9, 4]
*/
void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]);
/**
* Removes the elements in the range [start] to [end] exclusive.
*
* It is an error if [start]..[end] is not a valid range pointing into the
* `this`.
*/
void removeRange(int start, int end);
/**
* Sets the elements in the range [start] to [end] exclusive to the given
* [fillValue].
*
* It is an error if [start]..[end] is not a valid range pointing into the
* `this`.
*/
void fillRange(int start, int end, [E fillValue]);
/**
* Removes the elements in the range [start] to [end] exclusive and replaces
* them with the contents of the [iterable].
*
* It is an error if [start]..[end] is not a valid range pointing into the
* `this`.
*
* Example:
*
* var list = [1, 2, 3, 4, 5];
* list.replaceRange(1, 3, [6, 7, 8, 9]);
* print(list); // [1, 6, 7, 8, 9, 4, 5]
*/
void replaceRange(int start, int end, Iterable<E> iterable);
/**
* Returns an unmodifiable [Map] view of `this`.
*
* It has the indices of this list as keys, and the corresponding elements
* as values. The [Map.keys] [Iterable] will iterate the indices of this list
* in numerical order.
*/
Map<int, E> asMap();
}
Subclasses
DomStringList, FileList, Float32List, Float32x4List, Float64List, HtmlAllCollection, HtmlCollection, ImmutableListMixin<E>, Int16List, Int32List, Int64List, Int8List, JSArray<E>, LengthList, ListMixin<E>, MimeTypeArray, NodeList, NumberList, ObservableList<E>, PathSegList, PluginArray, SourceBufferList, SpeechGrammarList, SqlResultSetRowList, StringList, TextTrackCueList, TextTrackList, TouchList, TransformList, Uint16List, Uint32List, Uint64List, Uint8ClampedList, Uint8List
Implements
Constructors
factory List([int length]) #
Creates a list of the given length.
The list is a fixed-length list if length is provided, and an empty growable list if length is omitted.
It is an error if length is not a non-negative integer.
external factory List([int length]);
factory List.filled(int length, E fill) #
Creates a fixed-length list of the given length where each entry contains fill.
external factory List.filled(int length, E fill);
factory List.from(Iterable other, {bool growable: true}) #
Creates an list with the elements of other.
The order in the list will be the order provided by the iterator of other.
The returned list is growable if growable is true, otherwise it's a fixed length list.
factory List.from(Iterable other, { bool growable: true }) {
List<E> list = new List<E>();
for (E e in other) {
list.add(e);
}
if (growable) return list;
int length = list.length;
List<E> fixedList = new List<E>(length);
for (int i = 0; i < length; i++) {
fixedList[i] = list[i];
}
return fixedList;
}
factory List.generate(int length, E generator(int index), {bool growable: true}) #
Generate a List of values.
Creates a list with
length positions
and fills them by values created by calling
generator
for each index in the range 0 .. [length] - 1
in increasing order.
The created list's length is fixed unless growable is true.
factory List.generate(int length, E generator(int index),
{ bool growable: true }) {
List<E> result;
if (growable) {
result = <E>[]..length = length;
} else {
result = new List<E>(length);
}
for (int i = 0; i < length; i++) {
result[i] = generator(i);
}
return result;
}
Properties
final E first #
Returns the first element.
If this is empty throws a StateError. Otherwise this method is
equivalent to this.elementAt(0)
E get first;
final bool isEmpty #
Returns true if there is no element in this collection.
bool get isEmpty;
final bool isNotEmpty #
Returns true if there is at least one element in this collection.
bool get isNotEmpty;
abstract int get length #
Returns the number of elements in the list.
The valid indices for a list are 0 through length - 1.
abstract void set length(int newLength) #
Changes the length of the list. If
newLength is greater than
the current length, entries are initialized to null.
Throws an UnsupportedError if the list is not extendable.
final E single #
Returns the single element in this.
If this is empty or has more than one element throws a StateError.
E get single;
Operators
abstract E operator [](int index) #
Returns the element at the given index in the list or throws an RangeError if index is out of bounds.
abstract void operator []=(int index, E value) #
Sets the entry at the given index in the list to value.
Throws an RangeError if index is out of bounds.
Methods
abstract void add(E value) #
Adds value at the end of the list, extending the length by one.
Throws an UnsupportedError if the list is not extendable.
abstract void addAll(Iterable<E> iterable) #
Appends all elements of the iterable to the end of this list.
Extends the length of the list by the number of elements in iterable. Throws an UnsupportedError if this list is not extensible.
abstract bool any(bool test(E element)) #
Returns true if one element of this collection satisfies the predicate test. Returns false otherwise.
abstract Map<int, E> asMap() #
Returns an unmodifiable Map view of this.
It has the indices of this list as keys, and the corresponding elements as values. The [Map.keys] [Iterable] will iterate the indices of this list in numerical order.
abstract void clear() #
Removes all elements in the list.
The length of the list becomes zero.
Throws an UnsupportedError, and retains all elements, if the length of the list cannot be changed.
abstract bool contains(E element) #
Check whether the collection contains an element equal to element.
abstract E elementAt(int index) #
Returns the indexth element.
If this has fewer than
index elements throws a RangeError.
Note: if this does not have a deterministic iteration order then the
function may simply return any element without any iteration if there are
at least
index elements in this.
abstract bool every(bool test(E element)) #
Returns true if every elements of this collection satisify the
predicate
test. Returns false otherwise.
abstract void fillRange(int start, int end, [E fillValue]) #
Sets the elements in the range start to end exclusive to the given fillValue.
It is an error if
start..
end is not a valid range pointing into the
this.
abstract E firstWhere(bool test(E element), {E orElse()}) #
Returns the first element that satisfies the given predicate test.
If none matches, the result of invoking the
orElse function is
returned. By default, when
orElse is null, a StateError is
thrown.
abstract dynamic fold(initialValue, combine(previousValue, E element)) #
Reduces a collection to a single value by iteratively combining each element of the collection with an existing value using the provided function.
Use initialValue as the initial value, and the function combine to create a new value from the previous one and an element.
Example of calculating the sum of an iterable:
iterable.fold(0, (prev, element) => prev + element);
abstract void forEach(void f(E element)) #
Applies the function f to each element of this collection.
abstract Iterable<E> getRange(int start, int end) #
Returns an Iterable that iterators over the elements in the range
start to
end exclusive. The result of this function
is backed by this.
It is an error if end is before start.
It is an error if the
start and
end are not valid ranges at the time
of the call to this method. The returned Iterable behaves similar to
skip(start).take(end - start). That is, it will not throw exceptions
if this changes size.
Example:
var list = [1, 2, 3, 4, 5];
var range = list.getRange(1, 4);
print(range.join(', ')); // => 2, 3, 4
list.length = 3;
print(range.join(', ')); // => 2, 3
abstract int indexOf(E element, [int start = 0]) #
Returns the first index of element in the list.
Searches the list from index
start to the length of the list.
The first time an element e is encountered so that e == element,
the index of e is returned.
Returns -1 if
element is not found.
abstract void insert(int index, E element) #
Inserts the element at position index in the list.
This increases the length of the list by one and shifts all elements at or after the index towards the end of the list.
It is an error if the index does not point inside the list or at the position after the last element.
abstract void insertAll(int index, Iterable<E> iterable) #
Inserts all elements of iterable at position index in the list.
This increases the length of the list by the length of iterable and shifts all later elements towards the end of the list.
It is an error if the index does not point inside the list or at the position after the last element.
String join([String separator = ""]) #
Converts each element to a String and concatenates the strings.
Converts each element to a String by calling Object.toString on it. Then concatenates the strings, optionally separated by the separator string.
String join([String separator = ""]) {
StringBuffer buffer = new StringBuffer();
buffer.writeAll(this, separator);
return buffer.toString();
}
abstract int lastIndexOf(E element, [int start]) #
Returns the last index of element in the list.
Searches the list backwards from index start to 0.
The first time an element e is encountered so that e == element,
the index of e is returned.
If start is not provided, it defaults to this.length - 1.
Returns -1 if element is not found.
abstract E lastWhere(bool test(E element), {E orElse()}) #
Returns the last element that satisfies the given predicate test.
If none matches, the result of invoking the
orElse function is
returned. By default, when
orElse is null, a StateError is
thrown.
abstract Iterable map(f(E element)) #
Returns a lazy Iterable where each element e of this is replaced
by the result of f(e).
This method returns a view of the mapped elements. As long as the returned Iterable is not iterated over, the supplied function f will not be invoked. The transformed elements will not be cached. Iterating multiple times over the the returned Iterable will invoke the supplied function f multiple times on the same element.
abstract E reduce(E combine(E value, E element)) #
Reduces a collection to a single value by iteratively combining elements of the collection using the provided function.
Example of calculating the sum of an iterable:
iterable.reduce((value, element) => value + element);
abstract bool remove(Object value) #
Removes value from the list. Returns true if value was in the list. Returns false otherwise. The method has no effect if value value was not in the list.
abstract E removeAt(int index) #
Removes the element at position index from the list.
This reduces the length of this by one and moves all later elements
down by one position.
Returns the removed element.
Throws an ArgumentError if index is not an int.
Throws an RangeError if the index does not point inside the list.
Throws an UnsupportedError, and doesn't remove the element,
if the length of this cannot be changed.
abstract E removeLast() #
Pops and returns the last element of the list. Throws a UnsupportedError if the length of the list cannot be changed.
abstract void removeRange(int start, int end) #
Removes the elements in the range start to end exclusive.
It is an error if
start..
end is not a valid range pointing into the
this.
abstract void removeWhere(bool test(E element)) #
Removes all elements of this list that satisfy test.
An elements e satisfies
test if test(e) is true.
abstract void replaceRange(int start, int end, Iterable<E> iterable) #
Removes the elements in the range start to end exclusive and replaces them with the contents of the iterable.
It is an error if
start..
end is not a valid range pointing into the
this.
Example:
var list = [1, 2, 3, 4, 5];
list.replaceRange(1, 3, [6, 7, 8, 9]);
print(list); // [1, 6, 7, 8, 9, 4, 5]
abstract void retainWhere(bool test(E element)) #
Removes all elements of this list that fail to satisfy test.
An elements e satisfies
test if test(e) is true.
abstract void setAll(int index, Iterable<E> iterable) #
Overwrites elements of this with the elemenst of
iterable starting
at position
index in the list.
This operation does not increase the length of this.
It is an error if the index does not point inside the list or at the position after the last element.
It is an error if the iterable is longer than length - index.
abstract void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) #
Copies the elements of
iterable, skipping the
skipCount first elements,
into the range
start to
end exclusive of this.
If start equals end and start.. end represents a legal range, this method has no effect.
It is an error if
start..
end is not a valid range pointing into the
this.
It is an error if the iterable does not have enough elements after skipping skipCount elements.
Example:
var list = [1, 2, 3, 4];
var list2 = [5, 6, 7, 8, 9];
list.setRange(1, 3, list2, 3);
print(list); // => [1, 8, 9, 4]
abstract E singleWhere(bool test(E element)) #
Returns the single element that satisfies test. If no or more than one element match then a StateError is thrown.
abstract Iterable<E> skipWhile(bool test(E value)) #
Returns an Iterable that skips elements while test is satisfied.
The filtering happens lazily. Every new Iterator of the returned
Iterable iterates over all elements of this.
As long as the iterator's elements satisfy
test they are
discarded. Once an element does not satisfy the
test the iterator stops
testing and uses every later element unconditionally. That is, the elements
of the returned Iterable are the elements of this starting from the
first element that does not satisfy
test.
abstract void sort([int compare(E a, E b)]) #
Sorts the list according to the order specified by the compare function.
The compare function must act as a Comparator.
The default List implementations use Comparable.compare if compare is omitted.
abstract List<E> sublist(int start, [int end]) #
Returns a new list containing the elements from start to end.
If
end is omitted, the length of this is used.
It is an error if
start or
end are not indices into this,
or if
end is before
start.
abstract Iterable<E> takeWhile(bool test(E value)) #
Returns an Iterable that stops once test is not satisfied anymore.
The filtering happens lazily. Every new Iterator of the returned
Iterable will start iterating over the elements of this.
When the iterator encounters an element e that does not satisfy
test,
it discards e and moves into the finished state. That is, it will not
ask or provide any more elements.
abstract Iterable<E> where(bool test(E element)) #
Returns a lazy Iterable with all elements that satisfy the predicate test.
This method returns a view of the mapped elements. As long as the returned Iterable is not iterated over, the supplied function test will not be invoked. Iterating will not cache results, and thus iterating multiple times over the the returned Iterable will invoke the supplied function test multiple times on the same element.