可空参数的kotlin除法
假设我有一个如下结构的类可空参数的kotlin除法,kotlin,Kotlin,假设我有一个如下结构的类 class Test { var a: Double? = null var b: Double? = null; var c: Double? = null; } a和b在其他地方设置,如果至少有一个参数为null,则应将c计算为a/b或null。在Kotlin有没有一个简单的方法来实现这一点 我现在必须按以下方式进行: fun calculateValues() { ... val a = test.a val b = test.b i
class Test {
var a: Double? = null
var b: Double? = null;
var c: Double? = null;
}
a
和b
在其他地方设置,如果至少有一个参数为null
,则应将c
计算为a/b
或null
。在Kotlin有没有一个简单的方法来实现这一点
我现在必须按以下方式进行:
fun calculateValues() {
...
val a = test.a
val b = test.b
if (a != null && b != null)
test.c = a / b
...
}
由于逻辑在
Test
类之外,我没有发现在进行操作之前检查可空性的问题。无论如何,if else
也是Kotlin中的一个expressión,因此您可以执行以下操作:
val a = test.a
val b = test.b
t.c = if (a != null && b != null) a / b else null
由于逻辑在
Test
类之外,我没有发现在进行操作之前检查可空性的问题。无论如何,if else
也是Kotlin中的一个expressión,因此您可以执行以下操作:
val a = test.a
val b = test.b
t.c = if (a != null && b != null) a / b else null
当然,可以将其作为c的getter(这反过来又避免了将c存储为字段):
如果Test不是您的类,则始终可以使用扩展函数:
fun Test.updateC() {
c = if (a==null || b==null) null else a/b
}
fun notNull(vararg args: Any?, action: () -> Unit) {
when {
args.filterNotNull().size == args.size -> action()
}
}
然后可以像测试类的任何其他函数一样在测试实例上调用它:Test.updateC()
如果您需要在计算a/b时确保为空,则应使用下面@Joshua answer中所示的临时变量。或者也可以阅读以下Kotlin讨论:和票证:
我特别喜欢具有以下功能的可重用解决方案:
fun Test.updateC() {
c = if (a==null || b==null) null else a/b
}
fun notNull(vararg args: Any?, action: () -> Unit) {
when {
args.filterNotNull().size == args.size -> action()
}
}
然后可将其用作:
c = null
notNull(a, b) { c = a/b }
当然,可以将其作为c的getter(这反过来又避免了将c存储为字段):
如果Test不是您的类,则始终可以使用扩展函数:
fun Test.updateC() {
c = if (a==null || b==null) null else a/b
}
fun notNull(vararg args: Any?, action: () -> Unit) {
when {
args.filterNotNull().size == args.size -> action()
}
}
然后可以像测试类的任何其他函数一样在测试实例上调用它:Test.updateC()
如果您需要在计算a/b时确保为空,则应使用下面@Joshua answer中所示的临时变量。或者也可以阅读以下Kotlin讨论:和票证:
我特别喜欢具有以下功能的可重用解决方案:
fun Test.updateC() {
c = if (a==null || b==null) null else a/b
}
fun notNull(vararg args: Any?, action: () -> Unit) {
when {
args.filterNotNull().size == args.size -> action()
}
}
然后可将其用作:
c = null
notNull(a, b) { c = a/b }
这并不是我想要的——这个类应该只保存数据,而不是业务逻辑,还有7行额外的数据code@ekaerovets如果
c
始终仅从a
和b
计算,则应将其视为数据之一。此外,如果您想减少行数,最好的解决方案是不使用nullable。这是客户数据,它们很容易为nullable。我不想在类本身中计算c,因为有些字段需要来自其他类的数据,所以我更喜欢在单独的服务中计算类Test的所有字段。太糟糕了,语言设计不允许像/?@ekarovets这样的东西。您可以使用扩展名,如val Test.c
或fun Test.c()
不完全是我想要的-类应该只保存数据,而不是业务逻辑,还有7行额外的code@ekaerovets如果c
始终仅从a
和b
计算,则应将其视为数据之一。此外,如果您想减少行数,最好的解决方案是不使用nullable。这是客户数据,它们很容易为nullable。我不想在类本身中计算c,因为有些字段需要来自其他类的数据,所以我更喜欢在单独的服务中计算类Test的所有字段。太糟糕了,语言设计不允许像/?@ekarovets这样的东西。您可以使用扩展名,如val Test.c
或fun Test.c()
,这就是我现在所做的。问题是一个非常简单的操作需要2个额外的变量和3行代码。这就是我现在要做的。问题是,一个非常简单的操作需要2个额外变量和3行代码。您是否使用与您传递的a
和b
相同的代码/方法检索c
?确保b不等于0您是否使用与传递的a
和b
相同的代码/方法检索c
?确保b不等于0注意检查a==null
和b==null
不能保证在a/b
时不能为null。IDE应该警告您它们是可变的。你每次访问它们都不能保证值是相同的。链接到你的答案。另请参见:请注意,检查a==null
和b==null
并不保证在a/b
时不能为null。IDE应该警告您它们是可变的。你每次访问它们都不能保证值是相同的。链接到你的答案。另见: