如何在 null safe Dart 中将 List<String?> 转换为 List<String>?
How to convert a List<String?> to List<String> in null safe Dart?
我有一个飞镖列表:
List<String?> vals;
我想删除任何空值并将其转换为 List<String>
。
我试过:
List<String> removeNulls(List<String?> list) {
return list.where((c) => c != null).toList() as List<String>;
}
在 运行 时,我收到以下错误:
List<String?>' is not a subtype of type 'List<String>?'
解决这个问题的正确方法是什么?
理想情况下,您首先要从 List<String>
开始。如果您正在构建列表,例如:
String? s = maybeNullString();
var list = <String?>[
'foo',
'bar',
someCondition ? 'baz' : null,
s,
];
那么您可以使用 collection-if
来避免插入 null
元素:
String? s = maybeNullString();
var list = <String?>[
'foo',
'bar',
if (someCondition) 'baz',
if (s != null) s,
];
从 Iterable<T?>
和 中过滤掉 null
值并得到 Iterable<T>
结果的一种简单方法是使用 .whereType<T>()
。例如:
var list = <String?>['foo', 'bar', null, 'baz', null];
var withoutNulls = list.whereType<String>().toList();
另一种方法是使用 collection-for
和 collection-if
:
var list = <String?>['foo', 'bar', null, 'baz', null];
var withoutNulls = <String>[
for (var s in list)
if (s != null) s
];
最后,如果您已经知道您的 List
不包含任何 null
元素,而只需要将元素转换为不可空类型,则其他选项是使用 List.from
:
var list = <String?>['foo', 'bar', null, 'baz', null];
var withoutNulls = List<String>.from(list.where((c) => c != null));
或者如果您不想创建新的 List
,Iterable.cast
:
var list = <String?>['foo', 'bar', null, 'baz', null];
var withoutNulls = list.where((c) => c != null).cast<String>();
不新建List
void main() {
List<String?> list = ['a', null, 'b', 'c', null];
list.removeWhere((e) => e == null); // <-- This is all you need.
print(list); // [a, b, c]
}
创建一个新的List
先创建一个方法,filter
例如:
List<String> filter(List<String?> input) {
input.removeWhere((e) => e == null);
return List<String>.from(input);
}
您现在可以使用它了:
void main() {
List<String?> list = ['a', null, 'b', 'c', null];
List<String> filteredList = filter(list); // New list
print(filteredList); // [a, b, c]
}
要使用 retainWhere
,请将 removeWhere
中的谓词替换为 (e) => e != null
我有一个飞镖列表:
List<String?> vals;
我想删除任何空值并将其转换为 List<String>
。
我试过:
List<String> removeNulls(List<String?> list) {
return list.where((c) => c != null).toList() as List<String>;
}
在 运行 时,我收到以下错误:
List<String?>' is not a subtype of type 'List<String>?'
解决这个问题的正确方法是什么?
理想情况下,您首先要从
List<String>
开始。如果您正在构建列表,例如:String? s = maybeNullString(); var list = <String?>[ 'foo', 'bar', someCondition ? 'baz' : null, s, ];
那么您可以使用 collection-
if
来避免插入null
元素:String? s = maybeNullString(); var list = <String?>[ 'foo', 'bar', if (someCondition) 'baz', if (s != null) s, ];
从
Iterable<T?>
和 中过滤掉null
值并得到Iterable<T>
结果的一种简单方法是使用.whereType<T>()
。例如:var list = <String?>['foo', 'bar', null, 'baz', null]; var withoutNulls = list.whereType<String>().toList();
另一种方法是使用 collection-
for
和 collection-if
:var list = <String?>['foo', 'bar', null, 'baz', null]; var withoutNulls = <String>[ for (var s in list) if (s != null) s ];
最后,如果您已经知道您的
List
不包含任何null
元素,而只需要将元素转换为不可空类型,则其他选项是使用List.from
:var list = <String?>['foo', 'bar', null, 'baz', null]; var withoutNulls = List<String>.from(list.where((c) => c != null));
或者如果您不想创建新的
List
,Iterable.cast
:var list = <String?>['foo', 'bar', null, 'baz', null]; var withoutNulls = list.where((c) => c != null).cast<String>();
不新建
List
void main() { List<String?> list = ['a', null, 'b', 'c', null]; list.removeWhere((e) => e == null); // <-- This is all you need. print(list); // [a, b, c] }
创建一个新的
List
先创建一个方法,
filter
例如:List<String> filter(List<String?> input) { input.removeWhere((e) => e == null); return List<String>.from(input); }
您现在可以使用它了:
void main() { List<String?> list = ['a', null, 'b', 'c', null]; List<String> filteredList = filter(list); // New list print(filteredList); // [a, b, c] }
要使用 retainWhere
,请将 removeWhere
中的谓词替换为 (e) => e != null