可空参数的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应该警告您它们是可变的。你每次访问它们都不能保证值是相同的。链接到你的答案。另见: