在 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 有自己的)有什么缺点?
Kotlin 可以编译成 JavaScript(我没研究过)。如果项目依赖Java的Optional
/Stream
,编译成JS会不会有问题?
----更新----
No, common code can only depend on other common libraries. Kotlin has no support for translating Java bytecode into JS.
最佳答案
如果您不需要,我不会使用 Optional
。它只会增加不必要的开销,因为在 Kotlin 中使用可空类型更具可读性和惯用性。在 Kotlin 中使用 Optional
没有任何优势。
这里有另一个讨论:https://discuss.kotlinlang.org/t/java-api-design-for-kotlin-consumption-optional-or-null/2455
关于kotlin - Kotlin 的 DAO 应该返回 Optional 还是 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47529644/