Должен ли возврат DAO от Kotlin Необязательный или нулевой?

До 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 вводит нуль-безопасность, есть еще один идиоматический способ (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 зависела от Java8 по Optional дизайну API? Каковы недостатки проекта Kotlin, который будет зависеть от (или intercommunicate via) API-интерфейсов Java / Free / Stream API (поскольку у Kotlin есть свои собственные)?

Котлин может скомпилировать JavaScript (я этого не изучил). Если проект зависит от Optional / Stream Java, будет ли у него проблема с компиляцией JS?

—- обновлено —-

По словам Джетбрайнов

Нет, общий код может зависеть только от других общих библиотек. Kotlin не поддерживает перевод байт-кода Java в JS.

Я бы не использовал Optional если вам это не нужно. Это только добавляет лишние накладные расходы, поскольку работа с типами с нулевым значением более читабельна и более идиоматична в Котлине. В Котлин нет возможности использовать опцию.

Вот еще одно обсуждение этого вопроса: https://discuss.kotlinlang.org/t/java-api-design-for-kotlin-consumption-optional-or-null/2455