190 votes

Comment obtenir la première valeur non nulle en Java?

Est-il un Java équivalent de SQL COALESCE fonction? Ce qui est, est-il possible de revenir à la première valeur non nulle de plusieurs variables?

par exemple

Double a = null;
Double b = 4.4;
Double c = null;

Je veux en quelque sorte une déclaration qui retourne la première valeur non nulle de l' a, b, et c - dans ce cas, il serait de retour b, ou 4.4. (Quelque chose comme le sql de la méthode de retour COALESCE(a,b,c)). Je sais que je peux le faire explicitement avec quelque chose comme:

return a != null ? a : (b != null ? b : c)

Mais je me demandais si il y avait tout intégré, fonction acceptée pour accomplir cette tâche.

278voto

Andrzej Polis Points 121

ObjectUtils.firstNonNull(T...), à partir de Apache Commons Lang 3, sonne comme la solution de ce problème.

129voto

les2 Points 3854

Non, il n'y en a pas.

Le plus proche que vous pouvez obtenir est:

public static <T> T coalesce(T ...items) {
    for(T i : items) if(i != null) return i;
    return null;
}

Pour efficace raisons, vous pouvez gérer la plupart des cas, comme suit:

public static <T> T coalesce(T a, T b) {
    return a == null ? b : a;
}
public static <T> T coalesce(T a, T b, T c) {
    return a != null ? a : (b != null ? b : c);
}
public static <T> T coalesce(T a, T b, T c, T d) {
    return ...
}

64voto

Dave Points 3143

Si vous êtes à l'aide de Goyave, vous pouvez utiliser des Objets.firstNonNull(T...).

26voto

Eric Points 36290

A la suite de LES2 réponse, vous pouvez éliminer une certaine répétition dans la version efficace, en appelant la fonction surchargée:

public static <T> T coalesce(T a, T b) {
    return a != null ? a : b;
}
public static <T> T coalesce(T a, T b, T c) {
    return a != null ? a : coalesce(b,c);
}
public static <T> T coalesce(T a, T b, T c, T d) {
    return a != null ? a : coalesce(b,c,d);
}
public static <T> T coalesce(T a, T b, T c, T d, T e) {
    return a != null ? a : coalesce(b,c,d,e);
}

12voto

Franta Points 1299

Cette situation appelle un préprocesseur. Parce que si vous écrivez une fonction (méthode statique) qui prend le premier pas de valeur null, il évalue tous les éléments. C'est le problème si certains éléments sont des appels de méthode (peut-être le moment cher les appels de méthode). Et ces méthodes sont appelées, même si tout élément devant eux n'est pas nulle.

Certaines fonction comme ceci

public static <T> T coalesce(T ...items) …

doit être utilisé, mais avant de le compiler en code octet il devrait y avoir un préprocesseur qui trouvent les usages de cette "fusionner" et la remplace par la construction comme

a != null ? a : (b != null ? b : c)

Mise à jour 2014-09-02:

Grâce à Java 8 Lambdas et il y a possibilité d'avoir une vraie fusionnent en Java! Dont la caractéristique essentielle: en particulier les expressions sont évaluées uniquement lorsque cela est nécessaire – si, auparavant, on n'est pas null, alors la suite ne le sont pas évalués (méthodes ne sont pas appelés, de calcul ou de disque/réseau les opérations ne sont pas fait).

J'ai écrit un article à ce sujet Java 8: coalescer hledáme neNULLové hodnoty – (écrit en tchèque, mais j'espère que les exemples de code sont compréhensibles pour tout le monde).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X