Dart Spread运算符说“如果不为null,则将其放在列表中”

时间:2019-08-06 15:39:49

标签: dart

是否可以将Dart Spread运算符和null运算符组合使用?

[
  1, 
  ...twoOrNull() // this will be inserted only if it's null. something else than the ... operator will be here. 
  3, 
]

因此,列表将为[1, 2, 3][1, 3]。我猜twoOrNull()可以返回[2][],但是如果它可以返回2null,那就太好了。

是否可以不引入变量?

2 个答案:

答案 0 :(得分:1)

有一个空感知的传播算子(...?),但是您的twoOrNull()函数必须返回[2]null; Spread运算符在另一个集合常量中扩展了一个 iterable ,并且“传播” int毫无意义。

还有Dart的collection-if构造,但是它需要调用两次twoOrNull()或将结果保存在变量中:

[
  1, 
  if (twoOrNull() != null) twoOrNull(),
  3, 
]

有关传播和收集的更多信息,请参见the Lists section from the Dart Language Tour

答案 1 :(得分:1)

单线无副作用:

[
  1,
  ...[twoOrNull()]..removeWhere((x) => x == null),
  3,
]

这里的想法是将一个整数twoOrNull()映射到一个[2][]的列表,然后使用扩展运算符...对其进行展开。

请注意,在这种情况下使用一个twoOrNull()是可以的,但是一旦您开始拥有更多需要先进行空检查的元素,然后添加到列表中,可读性就会受到损害。在这种情况下,请考虑将null检查延迟到将元素添加到列表中之后,即

[
  1,
  twoOrNull(),
  3,
]..removeWhere((x) => x == null)

这将使代码更加直观易懂。

编辑:

为使列表中具有最佳的可读性,最好使用twoOrNullList()函数返回[2][]的函数。然后,您可以使用它与您建议的内容非常相似:

var twoOrNullList() => [twoOrNull()]..removeWhere((x) => x == null)
[
  1,
  ...twoOrNullList(),
  3,
]