作为代码审查过程的一部分,我将在代码中用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代码块。
请给出一个非常具体的例子,说明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的观点,这可能是个坏主意。
我正在用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
语句的两个分支。
来源-kotlinlang.org
改变用什么解决这个问题,,
代码库如下,将基于空校验运行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”中的每一行都会出现以下错误: 知道吗?