Java 8: Optional против if else. Что быстрее?

402
29 июля 2017, 04:33

С введением в Java 8 новой конструкции Optional у меня возникли разногласия с коллегами по поводу скорости работы Optional vs if-else vs тернарный оператор. Несколько примеров:

Java 8:

return Optional.ofNullable(user)
         .map(User::getUserSurname)
         .orElse("None");

Старый добрый вариант:

if (user != null && user.getUserSurname() != null) {
    return user.getUserSurname();
}
return "None";

Тернарный вариант:

return (user != null && user.getUserSurname() != null) ?
        user.getUserSurname() : "None"

P.S. Интересно было бы проверить и для более глубокой вложенности

return Optional.ofNullable(user)
         .map(User::getUserDetails())
         .map(User::getUserSurname())
         .orElse("None");
Answer 1

На самом деле лаконичней код или нет - личное дело каждого. Решающее значение обычно имеет производительность (если, конечно, это важно для проекта). По поводу производительности могу привести следующие результаты:

Benchmark                       Mode  Cnt  Score   Error  Units
MyBenchmark.ifElse              avgt  200  2.717 ± 0.036  ns/op
MyBenchmark.ifElseNullField     avgt  200  2.733 ± 0.045  ns/op
MyBenchmark.ifElseNullObject    avgt  200  2.789 ± 0.025  ns/op
MyBenchmark.optional            avgt  200  3.020 ± 0.042  ns/op
MyBenchmark.optionalNullField   avgt  200  5.570 ± 0.069  ns/op
MyBenchmark.optionalNullObject  avgt  200  2.936 ± 0.060  ns/op

Соответственной проверялся код из вопроса с несколькими вариантами:

  • с ненулевым объектом и ненулевым полем объекта
  • с ненулевым объектом и нулевым полем объекта
  • с нулевым объектом

О результатах судить не стану, дабы не развивать холивар.

READ ALSO
Почему не стартует Tomcat (OS не дает доступ к catalina.sh)?

Почему не стартует Tomcat (OS не дает доступ к catalina.sh)?

Я пытаюсь запустить Tomcat но получаю вот такую ошибку:

371
Клиент на другом компе не подключается к серверу. Java Socket

Клиент на другом компе не подключается к серверу. Java Socket

Здравствуйте! Пишу чат с использованием Java SocketНа локальном соединении всё работает(когда запускаю и сервер и клиент на одном компе)

368
Как отключить в intellij idea выполнение тестов?

Как отключить в intellij idea выполнение тестов?

Как отключить в intellij idea выполнение тестов при запуске проекта Maven командой Run из ее менюПодробнее

364