当前位置: 首页 > 知识库问答 >
问题:

静态编程语言:如何使用如果-其他喜欢的条件与让块为空检查

麹学文
2023-03-14

作为代码审查过程的一部分,我将在代码中用let块替换所有空检查。

1.带有空检查的代码示例:

if(someValue != null){//run if someValue is not null}
else {//run if someValue is null}

2.使用let-run块后的代码库,如果为空检查,

var someValue : String? = null
someValue = "SOF"

someValue?.let {safeSomeValue->
//This code block will run only if someValue is not null
}?.run {
//This code block should run only when if someValue is null, like else condition
}

现在,let-run块的问题是,即使某个值不是null,两个代码块都在运行。因此,我无法将代码示例1中的if-ther条件的行为复制到代码示例2中的run-let条件。

预期的行为是根据值是否为null执行let或run代码块。

共有3个答案

习胤运
2023-03-14

请给出一个非常具体的例子,说明zsmb13的答案所涉及的内容:

val someValue = 0
someValue?.let { safeSomeValue->
    println("then")
    null
} ?: run {
    println("else")
}

然后打印。您可以通过使用而不是let来解决这个问题:

val someValue = 0
someValue?.also { safeSomeValue->
    println("then")
    null
} ?: run {
    println("else")
}

将只打印然后。阅读https://kotlinlang.org/docs/reference/scope-functions.html并找出原因,并证明它确实总是等价于原始的if...但是我也同意zsmb13的观点,这可能是个坏主意。

端木承业
2023-03-14

我正在用let块替换代码中的所有空检查

这里的第一个问题是,为什么?这是不是比常规的if-elle结构更容易理解?我通常会对仅仅为了重构而重构保持警惕。

第二个考虑因素要重要得多:您正在进行的转换不等同于原始代码,您实际上正在用此更改修改行为。取下面这段代码:

var someValue : String? = null
someValue = "SOF"

someValue?.let {safeSomeValue->
    foo(someSafeValue)
    bar(someSafeValue)
} ?: run {
    println("shouldn't happen if someValue != null")
}

您希望run块仅在someValue==null时执行,但实际上这并不是它运行的唯一情况。整个someValue?。让{…} someValue本身是null时,而且当传递给let的块返回null时,code>表达式可以生成null值。在这种情况下,如果bar()函数调用导致null,则run语句将随后执行,因此运行您认为是虚构的if-else语句的两个分支。

曾修真
2023-03-14

来源-kotlinlang.org

  • ?.执行安全调用(调用方法或访问属性,如果接收器非空)
  • ?:如果左手值为null(elvis运算符),则取右手值

改变用什么解决这个问题,,

代码库如下,将基于空校验运行let或run块。

var someValue : String? = null
someValue = "SOF"

someValue?.let {safeSomeValue->
//This code block will run only if someValue is not null
}?:run {
//This code block will run only when if someValue is null, like else condition
}
 类似资料:
  • 我使用的是Gradle 5.5,我有一个基于Groovy的构建脚本,我正试图将其迁移到Kotlin DSL。任务包含将所有依赖项复制到jar文件的典型行: 我找不到一种方法来把这一行翻译成Kotlin DSL。 让我给你一些背景知识。这是我最初基于Groovy的构建脚本: 这是我基于静态编程语言的构建脚本。它运行良好,除了一行:

  • 我有一个数据结构如下的表: 我想得到独特的城市的结果输出,以及每月在其中注册的数量,作为数据类对象的列表 并使用此对象作为字符串来填充表格(我们不知道唯一城市的数量),结果应该是这样的: 我正在尝试这个 我知道,我应该使用Sum()和CaseWhenElse,就像这里一样,检查它给出了一个月数(1-12),用于将sum()结果分配给我的数据类属性,但我找不到任何CaseWhenElse语法的示例,

  • 在java中可以这样做//CHECKSTYLE: OFF这将关闭声纳中的检查样式警告。 此外,您可以更具体地在某一行前面使用@SuppressWarnings(“弃用”)。 我知道如果警告是固定的而不是抑制的会更好。Bot如何在静态编程语言中抑制? 我发现一些博客建议使用@Suppress(“某种类型”),但sonar仍然报告了这个问题。 有什么建议吗?

  • 我想在google api中更改我的标记。所以我在Picasso中使用了“getBitmap”功能,但此功能返回“位图?” .icon(位图描述符从位图(获取位图(user_URL[i])) - 所以,问题是: 类型不匹配错误(需要:位图,找到:位图?) java.lang.NullPointerException:图像在同一行中不能为空 我如何在科特林解决这个问题? 法典: 私人乐趣得到位图(网

  • 是否可以在中的class中添加一个新的静态方法?通常,由于Kotlin Extensions,这样的事情在Kotlin中是可能的。 我已经尝试在一个名为的文件中执行以下操作: 但<code>数学。无法解析同伴。。。

  • 我试图转换一些使用Jackson的@JsonSubTypes注释来管理多态性的Java代码。 以下是可用的Java代码: 以下是我认为等效的Kotlin代码: 但我在三行“JsonSubTypes.Type”中的每一行都会出现以下错误: 知道吗?