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

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

public interface UserDao extends JpaRepository { Optional findBySsn(String ssn); } 

而在来电方,如果我想通过SSN找人或创建用户,我可以这样写:

 val user = userDao.findBySsn(value).orElseGet { userDao.save(value) } 

它运作良好,看起来流利。

但是,由于Kotlin引入了无效安全,所以还有另外一种惯用的方式(Java中的dao):

 public interface UserDao extends JpaRepository { Optional 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是否依赖于Java8的Optional API设计? Kotlin项目依赖(或相互通信)Java8的Optional / Stream API(因为Kotlin有它自己的)有什么缺点?

Kotlin可以编译成JavaScript(我没有研究过)。 如果该项目是依赖于Java的Optional / Stream ,将有问题编译到JS?

– – 更新 – –

根据Jetbrains

不,通用代码只能依赖于其他通用库。 Kotlin不支持将Java字节码转换为JS。

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

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

Interesting Posts