Dart 列表中的空感知 .firstWhere、.singleWhere、.lastWhere?
Null-aware .firstWhere, .singleWhere, .lastWhere in Dart's List?
我经常在我的项目中使用.firstWhere((E element) -> bool) -> E
。当移植它以支持空安全时,我无法干净地处理在 List 实例中找不到元素的场景。
.firstWhere
、.singleWhere
和 .lastWhere
returns E
,而不是 E?
所以在处理 List 不存在的情况时包含必需的元素没有其他方法可以 return null
除了从例如投射整个列表。 List<String>
到 List<String?>
这使得测试函数担心每个元素可能为 null,而事实并非如此。在空安全之前,我只能使用 orElse: () => null
但空安全 orElse
必须 return 类型 E
的元素,因此需要麻烦的转换。
我是否必须用 null
替代每个类型才能在 orElse
中使用,或者是否有其他方法使列表检查支持 null 缺失元素的情况?
解决方案是在 Iterable
类型上创建扩展:
extension IterableModifier<E> on Iterable<E> {
E? firstWhereOrNull(bool Function(E) test) =>
cast<E?>().firstWhere((v) => v != null && test(v), orElse: () => null);
}
然后像这样使用它:
final myList = <String?>['A', 'B', null, 'C'];
String? result = myList.firstWhereOrNull((e) => e == 'D');
print(result); // output: null
result = myList.firstWhereOrNull((e) => e == 'A');
print(result); // output: "A"
您可以只使用 firstWhereOrNull,它应该完全符合您的预期。
我经常在我的项目中使用.firstWhere((E element) -> bool) -> E
。当移植它以支持空安全时,我无法干净地处理在 List 实例中找不到元素的场景。
.firstWhere
、.singleWhere
和 .lastWhere
returns E
,而不是 E?
所以在处理 List 不存在的情况时包含必需的元素没有其他方法可以 return null
除了从例如投射整个列表。 List<String>
到 List<String?>
这使得测试函数担心每个元素可能为 null,而事实并非如此。在空安全之前,我只能使用 orElse: () => null
但空安全 orElse
必须 return 类型 E
的元素,因此需要麻烦的转换。
我是否必须用 null
替代每个类型才能在 orElse
中使用,或者是否有其他方法使列表检查支持 null 缺失元素的情况?
解决方案是在 Iterable
类型上创建扩展:
extension IterableModifier<E> on Iterable<E> {
E? firstWhereOrNull(bool Function(E) test) =>
cast<E?>().firstWhere((v) => v != null && test(v), orElse: () => null);
}
然后像这样使用它:
final myList = <String?>['A', 'B', null, 'C'];
String? result = myList.firstWhereOrNull((e) => e == 'D');
print(result); // output: null
result = myList.firstWhereOrNull((e) => e == 'A');
print(result); // output: "A"
您可以只使用 firstWhereOrNull,它应该完全符合您的预期。