首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Dart扩展运算符说:“如果它不是空的话,把它放在列表中”

Dart扩展运算符说:“如果它不是空的话,把它放在列表中”
EN

Stack Overflow用户
提问于 2019-08-06 15:39:49
回答 3查看 1.9K关注 0票数 5

是否有Dart扩展操作符和空感知操作符的组合可以做到这一点?

代码语言:javascript
运行
复制
[
  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,那就太好了。

如果不引入变量,这是可能的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-08-07 08:20:03

有一个空感知的扩展运算符(...?),但是您的twoOrNull()函数必须返回[2]null;spread运算符扩展了在另一个集合文本中可迭代的内容,因此“扩展”int是没有意义的。

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

代码语言:javascript
运行
复制
[
  1, 
  if (twoOrNull() != null) twoOrNull(),
  3, 
]

有关扩展和收集-if的更多信息,请参见Dart语言之旅的列表部分

票数 9
EN

Stack Overflow用户

发布于 2019-08-07 11:51:51

没有副作用的单线衬垫:

代码语言:javascript
运行
复制
[
  1,
  ...[twoOrNull()]..removeWhere((x) => x == null),
  3,
]

这里的想法是从int twoOrNull()映射到[2][]的列表,然后使用...扩展运算符来展开它。

请注意,在本例中有一个twoOrNull()是可以的,但是一旦您开始有更多需要在列表中添加空检查的元素,可读性就会受到影响。在这种情况下,考虑将空检查延迟到将元素添加到列表之后,即

代码语言:javascript
运行
复制
[
  1,
  twoOrNull(),
  3,
]..removeWhere((x) => x == null)

这将使代码更加直观和可读性。

编辑:

为了获得列表中最好的可读性,最好有一个twoOrNullList()函数返回[2][]。然后,您可以使用它非常类似于您的建议:

代码语言:javascript
运行
复制
var twoOrNullList() => [twoOrNull()]..removeWhere((x) => x == null)
[
  1,
  ...twoOrNullList(),
  3,
]
票数 2
EN

Stack Overflow用户

发布于 2022-04-07 15:58:13

还有另一个解决办法。

代码语言:javascript
运行
复制
Iterable<T> emit<T>(T? p) sync* {
  if (p != null) {
    yield p;
  }
}

[
  1,
  ...emit(twoOrNull()),
  3,
]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57379601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档