Existe-t-il une expression lambda à travers laquelle je peux remplacer la valeur NaN par 0 ou -1 tout en la passant à une fonction?

Je sais que je peux mettre un chèque pour NaN comme ceci:

if (Double.isNaN(variable_name))
{
        // make it 0 or -1
}

Mais je veux le faire en utilisant une expression lambda comme

function_to_called("variable_string", variable_double); // have a check if variable double is NaN
0
driftking9987 3 sept. 2020 à 16:04

2 réponses

Meilleure réponse

Vous pouvez simplement utiliser un ternaire ... ? ... : ... au lieu de votre if chèque et en faire un lambda:

Function<Double, Double> deNan = n -> Double.isNaN(n) ? -1 : n;

Cependant, bien que ce soit joli et court, de cette façon vous devrez appeler apply sur le Function au lieu de pouvoir appeler la fonction directement, c'est-à-dire que vous devrez faire function_to_called("variable_string", deNan.apply(variable_double)); . Donc à la place, vous pouvez simplement le définir comme une méthode régulière au lieu d'un lambda afin de pouvoir l'utiliser comme deNan(variable_double).

De plus, comme déjà noté, remplacer NaN par une valeur "spéciale" (ou pas si spéciale) comme 0 ou -1 pourrait en fait ne pas être une si bonne idée. Au lieu de cela, il peut être préférable de filtrer entièrement les valeurs NaN ou de les gérer "correctement", quoi que cela implique dans votre scénario.

1
tobias_k 3 sept. 2020 à 13:28

Il n'y a pas de méthode intégrée car dans Arithmétique à virgule flottante NaN constante représente quelque chose qui est indéfini ou non représentable. Ce n'est pas la même chose qu'une valeur spécifique telle que 0 ou -1. Consultez cette question qui explique ce qu'est NaN.

Vous devez le gérer vous-même en écrivant la bonne logique dans votre propre méthode, comme vous l'avez déjà fait avec l'instruction if.

1
Karol Dowbecki 3 sept. 2020 à 13:36