我們正在將我們的Flutter應用程式遷移到空安全中,我遇到了一堆缺失的幫助程式,以便輕松地將一個可選項轉換為相同型別的非可選項。
為了讓您了解背景關系,我想要一個
List<String?> optionalList = ['hi', 'hola', null];
與compactMap()Swift類似,我想要一個函式可以將任何地圖轉換為排除空專案的地圖,并且只回傳非可選專案的串列,例如:
final List<String> newNonOptionalList = optionalList.compactMap((item) => item.toUpperCase());
// newNonOptionalList = ['HI', 'HOLA']
我正在嘗試為這些型別的案例提供幫助,包括我發現對Dart有價值的許多其他案例。
有沒有人知道為什么它不起作用,這是我迄今為止嘗試過的一些內容:
extension ListNullSafetyExtension<T> on List<T?>? {
Iterable<R> compactMap<R>(R Function(T element) convert) sync* {
for (var element in this.removeNulls()) {
if (element != null) yield convert(element);
}
}
List<T> removeNulls() {
if (this == null) return [];
this!.removeWhere((value) => (value == null));
return List.from(this!).whereType<T>().toList();
}
}
盡管這確實洗掉了空值并執行了映射,但它始終在串列中回傳相同的可選型別,這意味著它不會解開它并removeNulls()回傳 aList<dynamic>而不是 aList<the_type_I_used>
我非常感謝您幫助理解為什么這兩個函式永遠不會改變它們的型別,因為我只能找到該主題的非常基本的泛型帖子。
uj5u.com熱心網友回復:
改變這個:
final List<String> newNonOptionalList = optionalList.compactMap((item) => item.toUpperCase());
對此
final List<String> newNonOptionalList = optionalList.compactMap((item) => item.toUpperCase()).toList();
uj5u.com熱心網友回復:
您可以輕松地List<T?>將 a折疊為 aList<T>并null使用Iterable.whereType<T>()以下方法過濾掉元素:
List<String?> optionalList = ['hi', 'hola', null];
List<String> newNonOptionalList = optionalList.whereType<String>().toList();
如果你真的想要你自己的擴展方法(即使它沒有添加太多):
extension IterableNullSafetyExtension<T> on Iterable<T?>? {
Iterable<T> removeNulls() => this?.whereType<T>() ?? [];
}
此外,您嘗試實作的一個錯誤是它ListNullSafetyExtension<T>已經是通用的并且引數化了T. 當您稍后嘗試添加擴展方法時:
List<T> removeNulls<T>() {
<T>最后的額外部分再次使removeNulls泛型,使用獨立于from 的 a 。不要那樣做。TTListNullSafetyExtension
另請參閱:如何在空安全 Dart 中將 List<String?> 轉換為 List?堆疊溢位
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/311164.html
上一篇:(Java)在傳遞給int函式后將通用T陣列索引回傳為int?
下一篇:Java泛型函式回傳宣告
