Хороший способ преобразования 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, a NullPointerException 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 напрямую.