Можно ли использовать Optional исключительно для его метода map?

Является ли каноничным использование Optional исключительно для вызова метода map, чтобы избежать создания промежуточной переменной и применять это в тернарном операторе "?"? <br/> <br/> Например, вместо этого кода: <br/> <pre><code class="java">var something = getSomething();
var a = new Class1(something, something, something);</code></pre> <br/> можно использовать следующий подход: <br/> <pre><code class="java">var a = Optional.of(getSomething())
             .map(it -&gt; new Class1(it, it, it)).get();</code></pre>
  • 31 октября 2024 г. 2:02
Ответы на вопрос 2
Использование `Optional` исключительно для вызова метода `map` и избежания создания промежуточной переменной действительно возможно и может показаться элегантным решением в некоторых случаях. Однако стоит учитывать несколько моментов.

1. **Цель использования `Optional`**: Основная цель класса `Optional` — это представление потенциально отсутствующих значений и обработка этих случаев без использования `null`. Использование `Optional` просто для удобства в создании объекта может быть ошибочным.

2. **Проблемы с использованием `get()`**: Если результат метода `getSomething()` может быть `null`, вызов `get()` на `Optional`, который может быть пустым, приведет к `NoSuchElementException`. Чтобы избежать этого, нужно быть уверенным, что `getSomething()` никогда не возвращает `null`, или обрабатывать случай отсутствующего значения более безопасно — используя `orElse`, `orElseGet`, `orElseThrow` и другие методы.

3. **Читаемость кода**: Код, который использует `Optional` для создания объекта, может быть менее читаемым. Использование `Optional` подразумевает, что вы обрабатываете возможное отсутствие значения, и если у вас нет такой ситуации, может быть предпочтительнее просто использовать обычные конструкции.

4. **Явная семантика**: Использование `Optional` ставит акцент на то, что значение может отсутствовать, в то время как в вашем примере с `new Class1` речь идет о том, что требуется значение. Чтение из `Optional` может ввести в заблуждение, если разработчики не ожидают, что результат может быть пустым.

В итоге, если `getSomething()` действительно может вернуть `null`, используйте `Optional` с учетом его семантики. Если вы уверены, что значение всегда будет присутствовать, базовый подход без `Optional` может быть более подходящим. Например:

```java
var something = getSomething();
var a = new Class1(something, something, something);
```

Если же вы хотите гарантировать обработку отсутствующего значения, и ваш код понятен и читабелен, наличие `Optional` может быть уместным, но следует делать это осмысленно.
0. Тернарного оператора что-то я тут не вижу. 
1. Ничего не мешает вам сделать промежуточную переменную it, если уж у вас такая сильная тоска по острову в Балтийском заливе:
var it = getSomething();
var a = new Class1(it, it, it);

2. Optional.of - это какой-то исчезающе редкий, вымирающий вид. В нем нет никакого смысла. Используется только Optional.ofNullable.
а. Конструкция Optional позволяет эффективно бороться с нуллабельными объектами, подразумевая что есть Объект и возможная альтернатива в виде нула.
б. Если у вас железно, гарантированно объект "non-null", то и Optional не нужен и вообще не понятно, какая у него вторая альтернатива
3. Неправильно использовать .get() без проверки на null у Optional. Это вывод из п2, вообще-то. Вроде в вашем примере Optional от ненулабельного значения, но смысл это теряет на этапе Optinal.of.
4. В итоге Optional следует использовать как-то так:
var a = Optional.ofNullable(getSomething())
             .map(it -> new Class1(it, it, it))
             .orElseGet(() -> {
                    // TODO :: implement me
                });

Если getSomething железно отдает non-null объект, то вариант 1 будет лучше.
Похожие вопросы