You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart中如何用空安全语法糖实现仅非空时调用函数?

Dart 空安全下仅非空时调用函数的简洁实现

你要实现的逻辑可以通过几种简洁的方式实现,不用写冗长的临时变量代码:

方案1:利用 Dart 3.0+ 的模式匹配(推荐)

Dart 3.0及以上支持的模式匹配可以完美解决这个问题,只需要一次map访问,且仅当值非空时才调用目标函数:

final result = switch (map["key"]) {
  String val => int.tryParse(val) ?? defaultVal,
  _ => defaultVal,
};

如果喜欢更紧凑的写法,还可以用模式匹配的简写形式:

final result = map["key"] case String val ? int.tryParse(val) ?? defaultVal : defaultVal;

这种写法完全符合你的需求:只有map["key"]非空时才会执行int.tryParse,既不会重复访问map,也不用重复写默认值。

方案2:自定义极简扩展(类似Kotlin的let)

如果你的项目还在使用低于3.0的Dart版本,可以写一个非常轻量的扩展函数来模拟Kotlin的let逻辑,整个项目只需要定义一次:

extension LetExtension<T> on T? {
  R? let<R>(R Function(T) callback) => this != null ? callback(this!) : null;
}

之后就可以像Kotlin一样简洁调用:

final result = map["key"].let((val) => int.tryParse(val)) ?? defaultVal;

这个扩展只会在map["key"]非空时执行int.tryParse,同样满足你的要求。

关于你期望的语法糖

目前Dart确实没有支持func(null?) => null这类自动跳过空参数的语法糖,没办法直接写int.tryParse(map["key"]?) ?? defaultVal这种形式。

需要注意的是,类似int.tryParse(map["key"] ?? "")这种写法会无条件调用tryParse,哪怕map["key"]是null,不符合你提到的“避免调用耗时函数”的要求,所以不推荐。

内容的提问来源于stack exchange,提问作者superfuzzy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:01:35