是否可以将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]
或[]
,但是如果它可以返回2
或null
,那就太好了。
是否可以不引入变量?
答案 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,
]