将 Java 选项调用迁移到 kotlin

Migrate Java Option call to kotlin

我正在迈出使用 Kotlin 的第一步。

我正在将一些现有的 java 代码迁移到 kotlin。

我有以下行:

storyDate.ifPresent(article::setPublishDate);

其中 storyDate 是可选的,文章有一个方法 setPublishDate(Date) 方法。

如何将此行迁移到 kotlin?

https://try.kotlinlang.org 的自动迁移器是

storyDate.ifPresent(Consumer<Date>({ article.setPublishDate() }))

但是这一行不能用 kotlin 编译器编译。

在 Kotlin 中使用 Optional 是相当不常见的。如果您可以使 storyDate 作为普通的未包装类型工作,则通常可以使用简单的 let 调用来表达此类构造:

storyDate?.let {
    article.setPublishDate(it) 
    //probably property access works as well:
    article.publishDate = it
}

工作原理:仅当 storyDate 不是 null 时,安全调用 ?. 才会调用 let,否则整个表达式的计算结果再次为 null。当变量不是 null 时,使用简单的 lambda 调用 let,其中 it 可以访问 storyDate(或者您可以将其重命名为任何您喜欢的名称)。

旁注:

如果 storyDate 确实必须是 Optional,您仍然可以通过像这样展开它来使用描述的构造:

storyDate.orElse(null)?.let {}
storyDate.ifPresent { Article.setPublishDate(it) }

storyDate.ifPresent(Article::setPublishDate)

会起作用。

第一个例子中,it表示optional实例中的值,也就是optionalstoryDate中的Date

我假设 Article 是一个 class,它有 setPublishDate(Date) 静态方法,因为 class 名称总是大写。


但是如果 article 是一个实例,而不是 class,并且它有 non-static 方法,那么下面的方法将起作用。

// article = Article(/* some Article-typed object */)
storyDate.ifPresent { article.setPublishDate(it) }

it和上面的意义相同,即Optional.

中的实际Date

我非常喜欢使用扩展函数和扩展字段,所以我写得像

val <T> Optional<T>.value: T?
    get() = orElse(null)

然后您可以在任何地方(导入后)使用它,例如

myOptional.value?.let {
    // handle here
}