Khi làm việc với nhiều kiểu dữ liệu List hoặc Array, một số method sẽ rất hữu ích cho bạn. Hãy cùng tìm hiểu nhé!

1. forEach()
Function này giúp chúng ta lấy ra được từng phần tử ở trong danh sách từ vị trí đầu tiên đến vị trí cuối cùng.

List<String> animals = [‘dog’, ‘cat’, ‘bird’];
fruits.forEach((animal) => print(animal)); // => dog cat bird

2. map()
Trả về một Iterable mới, sau khi transform từng phần

List<String> animals = [‘dog’, ‘cat’, ‘bird’];
var mappedAnimals = animals.map((animal) => ‘I like $animal’).toList();
print(mappedAnimals); // => ['I like dog', ‘I like cat’, ‘I like bird’]

3. sort()
phương thức sort() để sắp xếp các phần tử trong một danh sách (List)

  • sắp xếp tăng dần
List<int> numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5];

// Sắp xếp danh sách theo thứ ttăng dần
numbers.sort();

print(numbers); // Kết quả: [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

  • sắp xếp giảm dần
List<int> numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5];

// Sắp xếp danh sách theo thứ tự giảm dần
numbers.sort((a, b) => b.compareTo(a));

print(numbers); // Kết quả: [9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1]

4. contains()
phương thức contains() được sử dụng để kiểm tra xem một giá trị cụ thể có tồn tại trong một danh sách (List) hoặc một chuỗi (String) hay không. Phương thức này trả về một giá trị boolean (true hoặc false) tùy thuộc vào việc giá trị đó có tồn tại trong danh sách hoặc chuỗi hay không.

List<int> numbers = [1, 2, 3, 4, 5];

bool containsValue = numbers.contains(3); // Kiểm tra xem số 3 có trong danh sách không

print(containsValue); // Kết quả: true

5. reduce(), fold()
reduce() và fold() là hai phương thức cho phép tích luỹ giá trị từ các phần tử trong danh sách (List), nhưng chúng có một số sự khác biệt quan trọng:
reduce():

  • reduce() nhận một hàm hoặc biểu thức để tích luỹ giá trị.
  • Không cần cung cấp giá trị khởi đầu.
  • Phương thức reduce() sẽ lấy giá trị đầu tiên trong danh sách làm giá trị khởi đầu và bắt đầu tích luỹ từ phần tử thứ hai.
List<int> numbers = [1, 2, 3, 4, 5];

int sum = numbers.reduce((value, element) => value + element);

print(sum); // Kết quả: 15 (1 + 2 + 3 + 4 + 5 = 15)

fold():

  • fold() nhận một giá trị khởi đầu và một hàm hoặc biểu thức để tích luỹ giá trị.
  • Bạn phải cung cấp giá trị khởi đầu mà quá trình tích luỹ sẽ bắt đầu từ đó.
  • Giá trị khởi đầu có thể là bất kỳ kiểu dữ liệu nào và không cần phải là loại dữ liệu của danh sách.
List<int> numbers = [1, 2, 3, 4, 5];
int initialValue = 10; // Giá trị khởi đầu

int sum = numbers.fold(initialValue, (value, element) => value + element);

print(sum); // Kết quả: 25 (10 + 1 + 2 + 3 + 4 + 5 = 25)

6. every()
Hàm every() trong Dart được sử dụng để kiểm tra xem tất cả các phần tử trong một danh sách (List) hoặc một Iterable có thỏa mãn một điều kiện cụ thể hay không. Hàm này trả về true nếu tất cả các phần tử thỏa mãn điều kiện và false nếu có ít nhất một phần tử không thỏa mãn điều kiện.

Cú pháp của hàm every() như sau:

bool every(bool Function(element) test)

Ví dụ:

void main() {
  List<int> numbers = [1, 2, 3, 4, 5];
  
  bool allEven = numbers.every((number) => number % 2 == 0);
  print("Tất cả các số trong danh sách là số chẵn: $allEven");
}

7. where(), firstWhere(), singleWhere()
Bạn có thể sử dụng các hàm where(), firstWhere(), và singleWhere() để lọc và trích xuất các phần tử từ một danh sách (List) hoặc một Iterable dựa trên một điều kiện cụ thể.

where()

  • Hàm where() được sử dụng để tạo một Iterable mới chứa các phần tử từ danh sách gốc (hoặc Iterable gốc) thỏa mãn một điều kiện cụ thể.
  • Hàm này trả về một Iterable mới chứa các phần tử thỏa mãn điều kiện.
List<int> numbers = [1, 2, 3, 4, 5];
var evenNumbers = numbers.where((number) => number % 2 == 0);
print(evenNumbers.toList()); // Kết quả: [2, 4]

firstWhere()

  • Hàm firstWhere() được sử dụng để trả về phần tử đầu tiên từ danh sách (hoặc Iterable) thỏa mãn một điều kiện cụ thể.
  • Nếu không có phần tử nào thỏa mãn điều kiện, bạn có thể cung cấp một giá trị mặc định (default) để tránh lỗi.
List<int> numbers = [1, 2, 3, 4, 5];
var firstEven = numbers.firstWhere((number) => number % 2 == 0, orElse: () => -1);
print(firstEven); // Kết quả: 2

singleWhere()

  • Hàm singleWhere() được sử dụng để trả về phần tử duy nhất từ danh sách (hoặc Iterable) thỏa mãn một điều kiện cụ thể.
  • Nếu không có hoặc có nhiều hơn một phần tử thỏa mãn điều kiện, hàm này sẽ ném ra một ngoại lệ (Exception). Bạn nên sử dụng firstWhere() nếu muốn tránh ngoại lệ khi không tìm thấy phần tử hoặc có nhiều hơn một phần tử thỏa mãn điều kiện.
List<int> numbers = [1, 2, 3, 4, 5];
var singleEven = numbers.singleWhere((number) => number % 2 == 0);
print(singleEven); // Kết quả: 2

8. List.from()
Hàm List.from() trong Dart được sử dụng để tạo một danh sách mới (List) bằng cách sao chép các phần tử từ một Iterable (ví dụ: danh sách, chuỗi, hoặc bất kỳ loại nào khác có thể lặp qua) vào danh sách mới. Hàm này cho phép bạn chuyển đổi một Iterable thành một danh sách.

Cú pháp của hàm List.from() như sau:

List<E> List.from(Iterable<E> elements, { bool growable: true })

  • elements: Đây là Iterable mà bạn muốn tạo danh sách từ.
  • growable: Đây là một tham số tùy chọn (mặc định là true). Nếu bạn đặt growable thành false, danh sách sẽ không thể thay đổi kích thước sau khi được tạo.
void main() {
  Iterable<int> iterableNumbers = [1, 2, 3, 4, 5];
  
  // Tạo một danh sách từ iterableNumbers
  List<int> numberList = List.from(iterableNumbers);
  
  print(numberList); // Kết quả: [1, 2, 3, 4, 5]
}

9. take(), skip()

take()

  • Phương thức take() được sử dụng để trích xuất một số lượng cố định phần tử từ đầu của một Iterable hoặc chuỗi.
  • Nó nhận một tham số là số nguyên dương xác định số lượng phần tử bạn muốn trích xuất.
  • Nếu số lượng phần tử bạn yêu cầu lớn hơn số phần tử có sẵn trong Iterable, nó sẽ chỉ trả về tất cả các phần tử có trong Iterable.
List<int> numbers = [1, 2, 3, 4, 5];
var firstThreeNumbers = numbers.take(3).toList();
print(firstThreeNumbers); // Kết quả: [1, 2, 3]

skip()

  • Phương thức skip() được sử dụng để bỏ qua một số lượng cố định phần tử từ đầu của một Iterable hoặc chuỗi và trả về phần còn lại.
  • Nó nhận một tham số là số nguyên dương xác định số lượng phần tử bạn muốn bỏ qua.
  • Nếu số lượng phần tử bạn yêu cầu lớn hơn hoặc bằng tổng số phần tử có sẵn trong Iterable, nó sẽ trả về một Iterable trống.
List<int> numbers = [1, 2, 3, 4, 5];
var numbersAfterFirstTwo = numbers.skip(2).toList();
print(numbersAfterFirstTwo); // Kết quả: [3, 4, 5]

10. expand()
Hàm expand() trong Dart được sử dụng để biến đổi các phần tử của một Iterable thành danh sách con và sau đó hợp nhất tất cả các danh sách con thành một Iterable chung. Điều này giúp tạo ra một Iterable mới bằng cách “làm phẳng” các phần tử con.

Cú pháp:

Iterable<T> expand< S >(Iterable< S > Function( E element ) f)

‘f’: Đây là một hàm mà bạn cung cấp để biến đổi mỗi phần tử của Iterable thành một danh sách các phần tử của kiểu S.

void main() {
  List<List<int>> nestedLists = [[1, 2], [3, 4, 5], [6, 7]];
  
  // Sử dụng expand() để mở rộng danh sách con thành danh sách chung
  var flattenedList = nestedLists.expand((list) => list).toList();
  
  print(flattenedList); // Kết quả: [1, 2, 3, 4, 5, 6, 7]
}

Hi vọng các phương thức trên sẽ giúp ích nhiều cho bạn trong công việc của mình.