【问题标题】:How can I convert List<T?> to List<T>? [duplicate]如何将 List<T?> 转换为 List<T>? [复制]
【发布时间】:2021-06-14 20:54:52
【问题描述】:

我有一个返回类型为List&lt;T?&gt;? 的函数。我知道我可以使用! 运算符将此返回类型转换为List&lt;T?&gt;,但是如何将其转换为List&lt;T&gt;?

我尝试过的代码:

// testFunction returns List<T?>?
var test = testFunction() as List<T>? ?? [];

结果:

The following _CastError was thrown building ...:
type 'List<T?>' is not a subtype of type 'List<T>?' in type cast

【问题讨论】:

  • 您必须map 覆盖元素并将每个元素从T? 转换为T。你想如何处理空值?您有三个选项:1) 强制展开和崩溃(断言任何值都不应该为空),2) 用 ?? 替换默认值,或 3) filter 将空元素排除在外,只保留非空值。
  • 成功了!谢谢@Alexander - 我认为答案将是一些我还没有偶然发现的晦涩符号。幸好没有!

标签: flutter dart


【解决方案1】:

三种解决方案

  • 这将添加空值并将 a 中的空值替换为 b 中的默认值
    List<T?>? a = [];
    List<T>? b = a.map((e) => e ?? defaultValue).toList();

  • 这些不考虑空值
    List<T?>? a = [];
    List<T> b2 = a.filter((v) => v != null).toList();
    List<T?>? a = [];

    List<int>? b2 = [];
    a.forEach((e) {
      if (e != null) b2.add(e);
    });

【讨论】:

  • 也可以将第二个例子改写为List&lt;T&gt; b2 = a.filter((v) =&gt; v != null).toList();
  • @enzo 谢谢我会添加它
猜你喜欢
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2019-04-13
  • 2019-05-20
  • 1970-01-01
  • 2014-02-05
相关资源
最近更新 更多