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

sma*_*ufo 7 dao spring-data spring-data-jpa kotlin

在Kotlin/JPA之前,我曾经写过这样的DAO层:

public interface UserDao extends JpaRepository<User,Long> {
    Optional<User> findBySsn(String ssn);
}
Run Code Online (Sandbox Code Playgroud)

在呼叫者方面,如果我想通过SSN找人或创建用户,我可以这样写:

val user = userDao.findBySsn(value).orElseGet {
    userDao.save(value)
}
Run Code Online (Sandbox Code Playgroud)

它运作良好,看起来流畅.

但是由于Kotlin引入了null安全性,还有另一种惯用方法(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)
}
Run Code Online (Sandbox Code Playgroud)

在客户端:

val user = userDao.findBySsnNullable(value)
      .takeIf{ it -> it != null}? : userDao.save(User(value))
Run Code Online (Sandbox Code Playgroud)

两种方式都很好.但我想知道哪个更受欢迎?Kotlin Optional在API设计中依赖Java8是否有益?Kotlin项目依赖于(或通过)Java8 Optional/ StreamAPI(因为Kotlin有它自己的)是什么缺点?

Kotlin可以编译成JavaScript(我还没有研究过).如果项目依赖于Java的Optional/ Stream,那么编译到JS会有问题吗?

- - 更新 - -

根据Jetbrains的说法

不,公共代码只能依赖于其他公共库.Kotlin不支持将Java字节码转换为JS.

s1m*_*nw1 5

Optional如果你没有,我不会用.它只会增加不必要的开销,因为使用可空类型在Kotlin中更具可读性和更具惯用性.Optional在Kotlin 中使用没有任何优势.

以下是对此的另一个讨论:https://discuss.kotlinlang.org/t/java-api-design-for-kotlin-consumption-optional-or-null/2455