Хороший способ преобразования Optional в Optional
Я пытаюсь найти чистый и эффективный для кода способ преобразования Optional<Integer>
to Optional<Long>
. Я работаю на Java 7 с Guava.
поэтому в одном месте кода у меня есть необязательное целое число, созданное
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
, aNullPointerException
is заброшенный.
так никогда возвращение null
С Function
перешло к transform
.
если вы используете это много, то вы можете использовать enum
паттерн Singleton:
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 напрямую.