Kotlin中的可空类型嵌套可空类型?

3

我有一个使用案例,需要双重空值,类似于x: SomeClass??。请参见以下Java代码中的prefetchedRecord参数。

public Optional<SomeClass> fetchRecord(Long id) {
   ...
}

public void process(
    Long id,
    Optional<Optional<SomeClass>> prefetchedRecord
) {
  Optional<SomeClass> fetchedRecord = prefetchedResult.orElseGet( () -> fetchRecord(id) )
  if (fetchedRecord.isPresent()) { ... process ... }
  else { ... do something else ... }
}

所以对于prefetchedRecord,内部的Optional表示获取的结果,而外部的Optional则显示在调用process函数之前是否进行了获取。我使用两个Optional来避免重新获取记录,即使获取返回了空值。
你会如何在Kotlin中编写这个代码?我意识到使用双重可选项并不是很清晰,我可以使用自定义类替代,比如...
data class FetchResult<T>(val result: T, val fetched: boolean)

但是我想知道 Kotlin 中是否有内置支持此用例的功能。

2个回答

2

在 Kotlin 中,无法对可空类型进行可空处理。我认为 Kotlin 的方式是在大多数情况下避免使用 null。您可以使用密封类来编写更具表现力的代码。

例如:

sealed class Result<out T> {
    data class Fetched<T>(val result: T): Result<T>()
    data class Prefetched<T>(val result: T): Result<T>()
    object None: Result<Nothing>()
}

密封类提供了代数数据类型支持,您可以使用这个强大的语言特性创建非常表达性的类型。 在某些情况下,您还可以使用Kotlin标准库中的Result


谢谢!这很有道理。只是为了确认一下,您的自定义密封类“Result”与标准的“Result”类没有任何关系,对吗?我应该给它起一个不同的名字? - Andrei Ivanov
是的,我的Result与标准的Result没有任何关系。但是如果你愿意,你可以保留这个名字,或者为你的情况找到更好的名字。 - ZSergei

0

不,Kotlin 中没有内置处理您要求的功能。如果您的目标是 Java 平台,您可以使用 java.util.Optional<T> 类:

fun process(id: Long, prefetchedRecord: Optional<Optional<SomeClass>>) {
    ...
}

或者您可以尝试使用java.util.Optional<T>类,像这样:

fun process(id: Long, prefetchedRecord: Optional<SomeClass>?) {
    ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接