是否有Dart扩展操作符和空感知操作符的组合可以做到这一点?
[
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
,那就太好了。
如果不引入变量,这是可能的吗?
发布于 2019-08-07 00:20:03
有一个空感知的扩展运算符(...?
),但是您的twoOrNull()
函数必须返回[2]
或null
;spread运算符扩展了在另一个集合文本中可迭代的内容,因此“扩展”int
是没有意义的。
还有Dart的集合-if构造,但它需要调用两次twoOrNull()
或将结果保存在变量中:
[
1,
if (twoOrNull() != null) twoOrNull(),
3,
]
有关扩展和收集-if的更多信息,请参见Dart语言之旅的列表部分。
发布于 2019-08-07 03:51:51
没有副作用的单线衬垫:
[
1,
...[twoOrNull()]..removeWhere((x) => x == null),
3,
]
这里的想法是从int twoOrNull()
映射到[2]
或[]
的列表,然后使用...
扩展运算符来展开它。
请注意,在本例中有一个twoOrNull()
是可以的,但是一旦您开始有更多需要在列表中添加空检查的元素,可读性就会受到影响。在这种情况下,考虑将空检查延迟到将元素添加到列表之后,即
[
1,
twoOrNull(),
3,
]..removeWhere((x) => x == null)
这将使代码更加直观和可读性。
编辑:
为了获得列表中最好的可读性,最好有一个twoOrNullList()
函数返回[2]
或[]
。然后,您可以使用它非常类似于您的建议:
var twoOrNullList() => [twoOrNull()]..removeWhere((x) => x == null)
[
1,
...twoOrNullList(),
3,
]
发布于 2022-04-07 07:58:13
还有另一个解决办法。
Iterable<T> emit<T>(T? p) sync* {
if (p != null) {
yield p;
}
}
[
1,
...emit(twoOrNull()),
3,
]
https://stackoverflow.com/questions/57379601
复制相似问题