как исправить 'Optional.get ()' без 'isPresent ()' - PullRequest
0 голосов
/ 02 августа 2020

Я просматривал несколько тем, но не нашел ссылки, чтобы попытаться сделать это с моей частью кода

public static SlotType Motor_IN = new SlotType(
    "motor_in", 
    (t, i, d) ->{
        if(t instanceof TileEntityMachineFrame){
            return Optional.of(
                 (new SlotMotor(
                     ( (TileEntityMachineFrame) t ).itItemHandler.get().motorInputWrapper, 
                     i, d.x, d.y
                  ))
            );
        }
        return null;
     }
);

1 Ответ

1 голос
/ 03 августа 2020

Вы забыли немного информации. Сейчас похоже, что ваш код возвращает 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. К тому же это автоматически дает вам то, что вы возвращаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...