将 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
}
我正在迈出使用 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
}