Хороший способ конвертировать Необязательный<Integer> в Необязательный<Long>
Я пытаюсь найти чистый и эффективный код для преобразования Optional<Integer>
в Optional<Long>
, Я работаю в Java 7 с гуавой.
Таким образом, в одном месте в коде я создал необязательное целое число
Optional<Integer> optionalInt = Optional.fromNullable(someInt);
А в другой области он мне нужен как опционально длинный. Самое приятное, что я мог придумать, это:
Optional<Long> optionalLong = optionalInt.transform(new Function<Integer, Long>() {
@Override
public Long apply(Integer inputInt) {
if (inputInt != null)
return inputInt.longValue();
else
return null;
}
});
Но это громоздко, особенно если учесть, как легко было приводить тип, когда я использовал примитивные типы.
Есть хорошие идеи там?
2 ответа
TL;DR: в Java 7, №
К сожалению, это лучшее, что может предложить Java 7 с точки зрения поддержки функций.
Я бы просто сказал, что transform
никогда не будет вызван с null
так что вы можете сделать:
Optional<Long> optionalLong = optionalInt.transform(new Function<Integer, Long>() {
@Override
public Long apply(Integer inputInt) {
return inputInt.longValue();
}
});
Из документации:
Если экземпляр присутствует, он преобразуется с данным
Function
; иначе,absent()
возвращается Если функция возвращаетnull
,NullPointerException
брошен
Так что никогда не вернусь null
из Function
перешел к transform
,
Если вы многократно используете это, то вы можете использовать enum
синглтон
public enum IntToLong implements Function<Integer, Long> {
INSTANCE;
@Override
public Long apply(Integer input) {
return input.longValue();
}
}
Затем:
optionalInt.transform(IntToLong.INSTANCE);
Это, очевидно, уменьшает код на сайте вызовов за счет наличия дополнительных классов в базе кода - что-то, о чем я не слишком беспокоюсь.
Близко к броску:
Optional<Long> optionalLong = Optional.fromNullable(optionalInt.isPresent() ?
optionalInt.get().longValue() : null);
в основном это позволяет избежать накладных расходов на вызов преобразования. Вызов isPresent может быть упрощен до прямой проверки значения null.