【Flutter 开发实战】Dart 基础篇:List 详解

手机APP/开发
144
0
0
2024-04-02
标签   Flutter

在这里插入图片描述

嗨,各位朋友们,欢迎来到这篇博客!今天我们将一起踏入 Dart 语言的神奇世界,深入了解 Dart 中的 List 类型。不用担心,我会尽可能用最通俗易懂的语言,让你对 List 有一个更深刻的理解。

Dart 中的 List

List - 让数据变得有趣!

在 Dart 语言中,List 就像一个神奇的盒子,可以放进去各种各样的东西,比如数字、文字,甚至是其他盒子(List)!今天,我们就来揭开 List 的神秘面纱,看看它是如何让数据变得有趣的。

在这里插入图片描述

// 创建一个充满数字的盒子
List<int> numbers = [1, 2, 3, 4, 5];

// 创建一个装满水果的盒子
List<String> fruits = ['apple', 'banana', 'orange'];

咦,看起来好像挺简单的吧?方括号里面放东西,逗号分隔,就是一个 List 了!

List 的小魔法
获取盒子的长度


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

print('盒子里有多少东西呢?答案是:$length 个!'); // 输出:盒子里有多少东西呢?答案是:5 个!

嘿,这个 length 就像是盒子的秘密标签,告诉你里面到底有多少东西。

拿出盒子里的东西


List<String> fruits = ['apple', 'banana', 'orange'];
String firstFruit = fruits[0];

print('盒子里的第一样东西是什么呢?是:$firstFruit'); // 输出:盒子里的第一样东西是什么呢?是:apple

哎呀,索引就像是盒子的小抽屉,从 0 开始,想拿出哪个就说出它的位置,比如 fruits[0] 就是拿出第一个水果。

往盒子里加新东西


List<String> fruits = ['apple', 'banana', 'orange'];
fruits.add('grape');

print('往盒子里加了一颗葡萄,现在是这样的:$fruits'); // 输出:往盒子里加了一颗葡萄,现在是这样的:[apple, banana, orange, grape]

fruits 盒子里原本有 apple、banana、orange,来了一颗新水果 grape,用 add 方法就能轻松加入盒子。

从盒子里拿掉东西
List<String> fruits = ['apple', 'banana', 'orange'];
fruits.remove('banana');

print('把香蕉拿出去了,盒子里现在是这样的:$fruits'); // 输出:把香蕉拿出去了,盒子里现在是这样的:[apple, orange]

remove 方法,就像把盒子里的东西拿出来一样,轻松又方便。

盒子漫游之遍历

遍历就像是打开盒子,逐个看看里面有什么,这可是盒子漫游的时刻!

for 循环遍历


List<int> numbers = [1, 2, 3, 4, 5];
for (int number in numbers) {
  print('这个数字是啥呢?是:$number');
}

for 循环,一个个数字出来亮相,好像数字们在做小秀一样。

forEach 方法遍历
List<String> fruits = ['apple', 'banana', 'orange'];
fruits.forEach((fruit) {
  print('这个水果是啥呢?是:$fruit');
});

forEach 方法更简单,像是盒子里的每个东西都过来和你打招呼,一点都不会掉队。

不得不说,List 可真是个有趣的小伙伴,让我们的数据变得生动起来!

List 的小秘密

在 Dart 的舞台上,List 扮演着一个神奇的角色,但在使用它的过程中,可能会遇到一些小问题。让我们一一解决这些谜题吧!

如何判断 List 是否为空?
List<String> fruits = [];
if (fruits.isEmpty) {
  print('哎呀,水果盒子空空如也!');
} else {
  print('水果盒子里有${fruits.length}种水果哦!');
}

通过 isEmpty 属性,我们可以轻松地判断 List 是否为空,就像翻开水果盒子看看里面有没有惊喜。

如何查找 List 中的最大值和最小值?
List<int> numbers = [10, 5, 8, 15, 3];
int maxNumber = numbers.reduce((value, element) => value > element ? value : element);
int minNumber = numbers.reduce((value, element) => value < element ? value : element);

print('最大值是:$maxNumber,最小值是:$minNumber');

通过使用 reduce 方法,我们可以像找宝藏一样,找到 List 中的最大值和最小值。

List 的进阶冒险

现在,让我们进入一些高级的 List 冒险,让你的 Dart 旅程更加丰富多彩。

使用 map 转换 List 中的元素
List<int> numbers = [1, 2, 3, 4, 5];
List<int> squaredNumbers = numbers.map((number) => number * number).toList();

print('原始数字列表:$numbers');
print('每个数字的平方列表:$squaredNumbers');

map 方法就像是 List 的魔法师,可以将每个元素进行转换,创造出一个全新的 List。

使用 where 过滤 List 中的元素


List<int> numbers = [1, 2, 3, 4, 5];
List<int> evenNumbers = numbers.where((number) => number % 2 == 0).toList();

print('原始数字列表:$numbers');
print('偶数列表:$evenNumbers');

where 方法就像是一位聪明的导游,可以根据你的喜好,为你筛选出特定的元素。

使用 sort 对 List 进行排序
List<int> numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5];
numbers.sort();

print('排序后的数字列表:$numbers');

sort 方法就像是整理房间,可以按照顺序排列,让一切井然有序。

使用 contains 判断 List 是否包含某个元素
List<String> fruits = ['apple', 'banana', 'orange'];
bool containsBanana = fruits.contains('banana');

if (containsBanana) {
  print('水果盒子里有香蕉哦!');
} else {
  print('水果盒子里没有香蕉。');
}

contains 方法就像是查找宝藏的探险者,可以告诉你是否在 List 中找到了特定的元素。

List 的奇妙嵌套

在 Dart 的舞台上,List 可以变得更加神奇,通过嵌套,你可以创建更复杂的数据结构。

在这里插入图片描述

List<List<int>> matrix = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
];

print('矩阵的第二行:${matrix[1]}');

这就像是在盒子里装盒子,通过嵌套,我们可以创建出更有趣的数据结构。

使用 List 的小心事项

在使用 List 的冒险中,一些小心事项也需要我们注意。

List 是可变的

在 Dart 中,List 是一位非常随和的小伙伴,你可以随时添加、删除或修改其中的元素。但别忘了,有时候要小心,避免意外发生。

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

print('修改后的数字列表:$numbers');

通过索引,我们可以直接修改 List 中的元素值,就像给小伙伴们换了新衣服一样。

避免空指针异常

在冒险的过程中,千万要确保不要走进“越界”的陷阱,以免出现空指针异常。

List<String> fruits = ['apple', 'banana', 'orange'];

if (fruits.length > 2) {
  print('第三个水果是:${fruits[2]}');
} else {
  print('水果盒子里没有第三个水果。');
}

在这个例子中,我们先判断盒子的大小,再去取第三个元素,确保一切安全。

Dart 中 List 的其他花样

除了上面的操作,List 在 Dart 中还有更多花样,比如在函数中传递多个参数、实现队列和栈等。

使用 List 传递多个参数
void printNumbers(List<int> numbers) {
  for (int number in numbers) {
    print(number);
  }
}

printNumbers([1, 2, 3, 4, 5]);

通过将参数声明为 List 类型,我们可以方便地一次传递多个值给函数,就像给朋友送上一箱好吃的糖果。

实现队列和栈
// 队列(先进先出)
Queue<int> queue = Queue();
queue.addAll([1, 2, 3, 4, 5]);

int firstElement = queue.removeFirst();
print('队列的第一个元素是:$firstElement');

// 栈(后进先出)
List<int> stack = [];
stack.addAll([1, 2, 3, 4, 5]);

int lastElement = stack.removeLast();
print('栈的最后一个元素是:$lastElement');

通过使用 Dart 中的 Queue 类和 List 的 removeFirstremoveLast 方法,我们可以模拟队列和栈的玩法,就像在玩游戏一样。

在 Dart 的大舞台上,List 是个多才多艺的演员,有了这些花样,你就能更自如地编写出丰富多彩的代码了!

List 魔法手册

在 Dart 的大舞台上,List 扮演着一个强大而灵活的角色。上面的部分我们介绍了 Dart 中 List 的常见用法,但在 Dart 中还有其它的一些属性和用法,接下来,就让我们一起来总结 List 的一些神奇属性和方法吧!

List 常用属性:

属性

描述

length

获取 List 的长度

reversed

翻转 List 中的元素

isEmpty

判断 List 是否为空

isNotEmpty

判断 List 是否不为空

1. length - 长度

length 属性用于获取 List 的长度,即 List 中元素的个数。

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

print('List 的长度是:$length'); // 输出:List 的长度是:5

这个属性非常简单,但在很多场景中都是必不可少的。

2. reversed - 翻转

reversed 属性用于将 List 中的元素翻转。

List<int> numbers = [1, 2, 3, 4, 5];
List<int> reversedNumbers = numbers.reversed.toList();

print('翻转后的数字列表:$reversedNumbers');

这样我们就能得到一个反向排列的 List。

3. isEmpty - 是否为空

isEmpty 属性用于判断 List 是否为空,返回一个布尔值。

List<String> fruits = [];
if (fruits.isEmpty) {
  print('水果列表为空!');
} else {
  print('水果列表不为空,有${fruits.length}种水果。');
}

这是一个常见的判断,以避免在空列表上执行不必要的操作。

4. isNotEmpty - 是否不为空

相应地,isNotEmpty 属性则判断 List 是否不为空,也返回一个布尔值。

List<String> fruits = ['apple', 'banana', 'orange'];
if (fruits.isNotEmpty) {
  print('水果列表不为空,有${fruits.length}种水果。');
} else {
  print('水果列表为空!');
}

这两个属性在条件判断中经常被用到。

List 常用方法:

方法

描述

add

向 List 的末尾添加一个元素

addAll

将一个 List 中的所有元素添加到另一个 List 的末尾

indexOf

查找 List 中某个特定值的索引,如果未找到则返回 -1

remove

删除 List 中指定值的第一个匹配项

removeAt

删除 List 中指定索引位置的元素

fillRange

修改 List 中一定范围内的元素值

insert

在 List 的指定位置插入一个元素

insertAll

在 List 的指定位置插入另一个 List 中的所有元素

toList

将其他类型的集合转换为 List

join

将 List 中的元素连接成一个字符串,可以指定连接符

split

将一个字符串按照指定的分隔符拆分成 List

forEach

遍历 List 中的每个元素,对每个元素执行指定的操作

map

对 List 中的每个元素执行指定的操作,并返回一个新的 List

where

根据指定的条件过滤 List 中的元素,返回一个新的 List

any

检查 List 中是否至少有一个元素满足指定的条件,返回一个布尔值

every

检查 List 中是否所有元素都满足指定的条件,返回一个布尔值

1. add - 增加

add 方法用于向 List 的末尾添加一个元素。

List<String> fruits = ['apple', 'banana', 'orange'];
fruits.add('grape');

print('添加葡萄后的水果列表:$fruits');

这是一个简单而常见的操作,用于动态地向 List 中添加元素。

2. addAll - 拼接数组

addAll 方法用于将一个 List 中的所有元素添加到另一个 List 的末尾。

List<int> numbers1 = [1, 2, 3];
List<int> numbers2 = [4, 5, 6];
numbers1.addAll(numbers2);

print('拼接后的数字列表:$numbers1');

这是一个很方便的方法,可以将两个 List 合并成一个。

3. indexOf - 查找

indexOf 方法用于查找 List 中某个特定值的索引,如果未找到则返回 -1。

List<String> fruits = ['apple', 'banana', 'orange'];
int indexOfBanana = fruits.indexOf('banana');

print('香蕉的索引是:$indexOfBanana'); // 输出:香蕉的索引是:1

通过这个方法,我们可以迅速找到某个元素在 List 中的位置。

4. remove - 删除

remove 方法用于删除 List 中指定值的第一个匹配项。

List<String> fruits = ['apple', 'banana', 'orange'];
fruits.remove('banana');

print('去掉香蕉后的水果列表:$fruits');

使用这个方法可以轻松地从 List 中移除指定的元素。

5. removeAt - 删除

removeAt 方法用于删除 List 中指定索引位置的元素。

List<String> fruits = ['apple', 'banana', 'orange'];
fruits.removeAt(1);

print('去掉索引为1的水果后的水果列表:$fruits');

这个方法对于根据索引值删除元素非常有用。

6. fillRange - 修改

fillRange 方法用于修改 List 中一定范围内的元素值。

List<int> numbers = [1, 2, 3, 4, 5];
numbers.fillRange(1, 3, 10);

print('修改范围后的数字列表:$numbers');

这个方法让我们可以在 List 中指定范围内进行批量修改。

7. insert - 指定位置插入

insert 方法用于在 List 的指定位置插入一个元素。

List<String> fruits = ['apple', 'banana', 'orange'];
fruits.insert(1, 'grape');

print('在索引1处插入葡萄后的水果列表:$fruits');

通过这个方法,我们可以灵活地在 List 中的任意位置插入元素。

8. insertAll - 指定位置插入 List

insertAll 方法用于在 List 的指定位置插入另一个 List 中的所有元素。

List<String> fruits = ['apple', 'banana', 'orange'];
fruits.insertAll(1, ['grape', 'kiwi']);

print('在索引1处插入葡萄和猕猴桃后的水果列表:$fruits');

这个方法对于批量插入元素非常方便。

9. toList - 其他类型转换成 List

toList 方法用于将其他类型的集合(如 Set)转换为 List。

Set<int> uniqueNumbers = {1, 2, 3, 4, 5};
List<int> numbersList = uniqueNumbers.toList();

print('Set 转换成 List 后的数字列表:$numbersList');

这个方法对于在不同集合类型之间进行转换很有用。

10. join - List 转换成字符串

join 方法用于将 List 中的元素连接成一个字符串,可以指定连接符。

List<String> fruits = ['apple', 'banana', 'orange'];
String fruitString = fruits.join(', ');

print('水果列表转换成字符串:$fruitString');

通过这个方法,我们可以方便地将 List 转换为可读性更好的字符串。

11. split - 字符串转化成 List

split 方法用于将一个字符串按照指定的分隔符拆分成 List。

String fruitsString = 'apple,banana,orange';
List<String> fruitsList = fruitsString.split(',');

print('字符串转换成水果列表:$fruitsList');

这个方法在处理从文件或网络获取的逗号分隔的数据时非常实用。

12. forEach

forEach 方法用于遍历 List 中的每个元素,对每个元素执行指定的操作。

List<int> numbers = [1, 2, 3, 4, 5];
numbers.forEach((number) {
  print('当前数字是:$number');
});

这是一种简洁的方式来遍历 List。

13. map

map 方法用于对 List 中的每个元素执行指定的操作,并返回一个新的 List。

List<int> numbers = [1, 2, 3, 4, 5];
List<int> squaredNumbers = numbers.map((number) => number * number).toList();

print('原始数字列表:$numbers');
print('每个数字的平方列表:$squaredNumbers');

通过这个方法,我们可以方便地对 List 进行转换。

14. where

where 方法用于根据指定的条件过滤 List 中的元素,返回一个新的 List。

List<int> numbers = [1, 2, 3, 4, 5];
List<int> evenNumbers = numbers.where((number) => number % 2 == 0).toList();

print('原始数字列表:$numbers');
print('偶数列表:$evenNumbers');

这是一种强大的方法,可以根据需要筛选 List 中的元素。

15. any

any 方法用于检查 List 中是否至少有一个元素满足指定的条件,返回一个布尔值。

List<int> numbers = [1, 2, 3, 4, 5];
bool hasEvenNumber = numbers.any((number) => number % 2 == 0);

if (hasEvenNumber) {
  print('列表中有偶数。');
} else {
  print('列表中没有偶数。');
}

这个方法对于检查是否存在符合条件的元素很有用。

16. every

every 方法用于检查 List 中是否所有元素都满足指定的条件,返回一个布尔值。

List<int> numbers = [2, 4, 6, 8, 10];
bool allEvenNumbers = numbers.every((number) => number % 2 == 0);

if (allEvenNumbers) {
  print('列表中所有数字都是偶数。');
} else {
  print('列表中至少有一个不是偶数。');
}

这个方法对于检查是否所有元素都满足条件很有用。

结语

通过这篇博客,我们深入探讨了 Dart 中 List 的方方面面。从基本操作到高级应用,希望你现在对 Dart 中的 List 有了更清晰的认识。

  • 我们学习了如何创建、访问和操作 List。
  • 了解了如何遍历 List,并解决了一些常见问题。
  • 探讨了一些高级操作,包括转换、过滤和排序。
  • 知道了 List 可以嵌套,用于处理更复杂的数据结构。
  • 注意了在使用 List 时的一些小细节,避免了一些常见错误。

希望通过这篇博客,你对 Dart 中的 List 有了更深入的理解。在你的 Dart 之旅中,List 将是一个非常有力的工具,帮助你处理各种数据。加油,各位朋友们,愿你们在 Dart 的世界中越走越远!

作者 : 繁依Fanyi

CSDN: https://techfanyi.blog.csdn.net

掘金:https://juejin.cn/user/4154386571867191