Вы забыли немного информации. Сейчас похоже, что ваш код возвращает Optional
или null
. В этом суть Optional, хотя у него может ничего не быть.
if(t instanceof TileEntityMachineFrame){
//...
} else{
return Optional.empty();
}
Таким образом вы вернете пустой optional, а не null. Следующая проблема - это ваш .get
предупреждает вас. Поскольку он находится в Необязательном порядке, вы должны учитывать, что Необязательный будет пустым. Самая простая замена - заменить get на Optional.orElse . Так что же тогда происходит с вашим конструктором?
Вы можете заменить вызов .get
на map.
return ( (TileEntityMachineFrame) t ).itItemHandler.map(
handler-> new SlotMotor( handler.motorInputWrapper, i, d.x, d.y )
);
Из javadocs для Map: «Если значение присутствует, возвращается необязательный описывая (как если бы с помощью ofNullable (T)) результат применения данной функции сопоставления к значению, в противном случае возвращает пустой параметр Optional. "
Разбивка на более
Я думаю, вы слишком много пытались собрать, вам следует немного разложить его, чтобы лучше понять, что вы делаете.
Optional<ItemHandler> opt = ( (TileEntityMachineFrame) t ).itItemHandler;
ItemHandler handler = opt.get();
SlotMotor motor = new SlotMotor( handler.motorInputWrapper, i, d.x, d.y);
Optional<SlotMotor> optionalMotor = Optional.of(motor);
В этом коде вы получаете предупреждение, потому что есть вызов чтобы получить без использования isPresent
, можно изменить только один способ - использовать карту.
Optional<SlotMotor> optionalMotor = opt.map(
handler -> new SlotMotor( handler.motorInputWrapper, i, d.x, d.y )
);
Нет пропущенного вызова get
, потому что мы работаем внутри лямбды, переданной в map. К тому же это автоматически дает вам то, что вы возвращаете.