Страницы

Поиск по вопросам

вторник, 10 декабря 2019 г.

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

#java #производительность #optional


С введением в 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");

    


Ответы

Ответ 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 Соответственной проверялся код из вопроса с несколькими вариантами: с ненулевым объектом и ненулевым полем объекта с ненулевым объектом и нулевым полем объекта с нулевым объектом О результатах судить не стану, дабы не развивать холивар.

Комментариев нет:

Отправить комментарий