В Java значение Optional
представляет собой объединение бита, который указывает на наличие или отсутствие, со значением произвольного ссылочного типа T
или примитива int
, long
или double
.
Слияние их особенно полезно при возврате значения из метода, поскольку методы имеют только одно возвращаемое значение. Часто необходимо использовать специальное значение, такое как null
в случае ссылочных типов или -1 в случае int
, в качестве часового для указания случая "без значения". Использование Optional
в качестве возвращаемого значения позволяет избежать проблемы, связанной с тем, что вызывающий абонент случайно использует значение часового в качестве реального возвращаемого значения.
Учитывая это, строка кода, такая как
Optional.ofNullable(port).ifPresent(settings::setPort);
странно тем, что объединяет значение с текущим / отсутствующим битом в первой части строки, а затем сразу же разделяет их во второй части строки. Это добавляет сложности к тому, что в конечном итоге является довольно простой задачей: проверить, является ли port
ненулевым, и условно выполнить некоторое действие. Фрагмент альтернативного кода:
if (port != null) {
settings.setPort(port);
}
достаточно ясно выражает, что именно делает.
Это правда, что оператор if занимает больше вертикального пространства, чем цепочка Optional
. Цепочка Optional
плотнее, но ее также сложнее понять: плохой компромисс.