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.
Optional如果你没有,我不会用.它只会增加不必要的开销,因为使用可空类型在Kotlin中更具可读性和更具惯用性.Optional在Kotlin 中使用没有任何优势.
以下是对此的另一个讨论:https://discuss.kotlinlang.org/t/java-api-design-for-kotlin-consumption-optional-or-null/2455
| 归档时间: |
|
| 查看次数: |
939 次 |
| 最近记录: |