Должен ли возврат 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

Intereting Posts
Получить N последних объектов, испускаемых наблюдаемыми в RxJava2 Как получить позицию OnScroll в WebView Android Ошибка при попытке использовать библиотеку Room. Ошибка SQL или отсутствующая база данных Неправильное отношение типа Corda WireTransaction – TransactionSignature выведено, но DigitalSignature.WithKey ожидается Как делегировать реализацию собственности в Котлин? Почему я получаю ArrayIndexOutOfBoundsException, выполняющий этот конкретный шаг Cucumber в Котлине? Перегруженные методы, получающие функции более высокого порядка в Котлине Как я могу получить мои тесты JUnit для компиляции и запуска в моем проекте Kotlin + Gradle? Kotlin: видимый делегат свойства nullable Конструктор супертипов объекта Котлин Проект не будет построен с Kotlin 1.1.3 Ссылки на общие функции Как я могу заставить конечную точку остального читать файл cookie и использовать это значение в okhttp Interceptor? Что можно выразить в константе времени компиляции (const val)? котлин – царство и посылка