【发布时间】:2018-05-11 19:06:32
【问题描述】:
在 Kotlin/JPA 之前,我曾经这样编写我的 DAO 层:
public interface UserDao extends JpaRepository<User,Long> {
Optional<User> findBySsn(String ssn);
}
在调用方,如果我想通过 SSN 找人或创建用户,我可以这样写:
val user = userDao.findBySsn(value).orElseGet {
userDao.save(value)
}
效果很好,看起来很流畅。
但由于 Kotlin 引入了 null-safety ,还有另一种惯用的方式(dao 仍在 Java 中):
public interface UserDao extends JpaRepository<User,Long> {
Optional<User> findBySsn(String ssn);
@Query("select u from User u where u.ssn = :ssn")
@Nullable User findBySsnNullable(@Param("ssn") String ssn)
}
在客户端:
val user = userDao.findBySsnNullable(value)
.takeIf{ it -> it != null}? : userDao.save(User(value))
这两种方式都很好。但我想知道哪个是首选? Kotlin 在 API 设计中依赖 Java8 的 Optional 是否有好处? Kotlin 项目依赖(或通过)Java8 的 Optional/Stream API(因为 Kotlin 有自己的 API)有什么缺点?
Kotlin 可以编译成 JavaScript(我没研究过)。如果项目依赖Java的Optional/Stream,编译成JS会不会有问题?
----更新----
不可以,通用代码只能依赖于其他通用库。科特林有 不支持将 Java 字节码翻译成 JS。
【问题讨论】:
-
An
Optional’s place in Kotlin - 如果不需要,可空类型绝对是更惯用的解决方案 -
在您的示例中,您甚至不必使用
takeIf部分。没有也一样。 -
谢谢@tynn ...
标签: kotlin spring-data spring-data-jpa dao