kotlin - Kotlin 的 DAO 应该返回 Optional 还是 null?

标签 kotlin spring-data spring-data-jpa dao

在 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会不会有问题?

----更新----

根据Jetbrains

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/

相关文章:

kotlin - 什么是 Kotlin 相当于 Class<?>

java - 使用 Spring Data Rest 提供 Java 模型的 RDF/XML 和 JSON-LD 表示形式?

hibernate - spring.jpa.hibernate.ddl-auto=validate 是否对数据库架构进行了更改?

java - 当第一个实体是具有指定主键的实体之后的后续实体时,如何使用 JPA 获取列表

java - @Query 不接受 LIKE 来执行细粒度搜索

java - 在 ObjectBox 中级联删除或对此进行模拟

android - 将 Kotlin 运行时库添加到 android 中的 aar

exception - kotlin如何将检查异常更改为运行时异常?

java - Spring JPA + Hibernate 搜索 : How update the Search Index(Lucene) only?

java - 在 Spring Boot 中创建新的实体对象