Bonne façon de convertir optionnel en optionnel

j'essaie de trouver un moyen propre et code-efficace pour convertir Optional<Integer>Optional<Long>. Je travaille à Java 7 avec de la goyave.

Donc dans un endroit dans le code j'ai un entier optionnel créé

    Optional<Integer> optionalInt = Optional.fromNullable(someInt);

et dans un autre domaine j'en ai besoin comme un long optionnel. La plus belle chose qui me vient en tête est: est-ce

    Optional<Long> optionalLong = optionalInt.transform(new Function<Integer, Long>() {
        @Override
        public Long apply(Integer inputInt) {
            if (inputInt != null)
                return inputInt.longValue();
            else
                return null;
        }
    });

mais c'est encombrant, surtout si on considère à quel point il était facile de lancer le type quand j'utilisais des types primitifs.

Toutes les bonnes idées là-bas?

20
demandé sur Jim Garrison 2015-06-09 13:50:27

2 réponses

TL;DR: in Java 7, no.

malheureusement, C'est le meilleur Java 7 A à offrir en termes de support pour les fonctions.

je dirais simplement que transform ne sera jamais appelé par null de sorte que vous pouvez faire:

Optional<Long> optionalLong = optionalInt.transform(new Function<Integer, Long>() {
    @Override
    public Long apply(Integer inputInt) {
        return inputInt.longValue();
    }
});

la documentation:

si l'instance est présente, elle est transformée avec la donnée Function; sinon, absent() est renvoyé. Si la fonction retourne null, un NullPointerException est jetée.

jamais retour null dans un Function passé transform.

si vous réutilisez cela beaucoup, alors vous pouvez utiliser le enum le pattern singleton:

public enum IntToLong implements Function<Integer, Long> {

    INSTANCE;

    @Override
    public Long apply(Integer input) {
        return input.longValue();
    }
}

Puis:

optionalInt.transform(IntToLong.INSTANCE);

cela réduit évidemment le code au site d'appel au détriment d'avoir des cours supplémentaires dans la base de code - quelque chose dont je ne serais pas trop inquiet.

20
répondu Boris the Spider 2015-06-09 11:03:53

fermer pour le casting:

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

en gros, cela évite la surabondance d'invoquer transform. Invoquer isPresent pourrait être simplifié pour vérifier directement la valeur de null.

3
répondu Remigius Stalder 2015-06-09 11:07:23