Подтвердить что ты не робот

Хороший способ конвертировать необязательный <Integer> в необязательный <Long>

Я пытаюсь найти чистый и эффективный код для преобразования Optional<Integer> в 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;
        }
    });

Но это громоздко, особенно если вы считаете, насколько легко было использовать тип, когда я использовал примитивные типы.

Какие-нибудь хорошие идеи?

4b9b3361

Ответ 1

TL; DR: В Java 7, No.

К сожалению, это лучшая 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, a NullPointerException.

Так никогда не возвращать 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);

Это, очевидно, уменьшает код на сайте вызова за счет наличия дополнительных классов в базе кода - я бы не стал слишком беспокоиться.

Ответ 2

рядом с литом:

Optional<Long> optionalLong = Optional.fromNullable(optionalInt.isPresent() ?
     optionalInt.get().longValue() : null);

в основном это позволяет избежать накладных расходов при вызове преобразования. Вызов isPresent может быть упрощен для непосредственного проверки значения null.