2

我正在使用 kotlin 迈出第一步。

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

我有以下行:

storyDate.ifPresent(article::setPublishDate);

其中 storyDate 是一个 Optional 并且 article 有一个方法 setPublishDate(Date) 方法。

我将如何将此行迁移到 kotlin?

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

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

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

4

3 回答 3

9

我非常喜欢使用扩展函数和扩展字段,所以我写了 smth like

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

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

myOptional.value?.let {
    // handle here
}
于 2018-02-19T10:25:57.267 回答
4
storyDate.ifPresent { Article.setPublishDate(it) }

或者

storyDate.ifPresent(Article::setPublishDate)

将工作。

在第一个示例中,it表示可选实例中的值,即可选实例Date中的storyDate

我假设这Article是一个具有setPublishDate(Date)静态方法的类,因为类名总是大写的。


但是如果article是一个实例,而不是一个类,并且它具有非静态方法,那么以下将起作用。

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

it与上述含义相同,即 中的实际DateOptional

于 2018-02-19T09:13:01.193 回答
4

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

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

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

边注:

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

storyDate.orElse(null)?.let {}
于 2018-02-19T09:07:32.160 回答