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?
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();
}
});
si l'instance est présente, elle est transformée avec la donnée
Function
; sinon,absent()
est renvoyé. Si la fonction retournenull
, unNullPointerException
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.
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.