Хороший способ конвертировать Необязательный<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.

Другие вопросы по тегам