Pourquoi ne pas-chaque méthode java génère pas d'exception quand un argument de type de fonction est passée au lieu de consommation?

Sudhanshu Jaisani:

Pourquoi ne pas la forEachméthode en java montre pas une erreur de compilation quand un argument de type de fonction est passée au lieu de consommation? Ici , les deux lignes reviennent une valeur booléenne pour chaque élément dans le flux , mais seulement 2e ligne obtient une erreur de compilation? Y at - il autre propriété d' expression lambda pour un tel scénario?

Voici mon code:

Stream.of(1,2,3,4).forEach(a->a.equals(1));//line 1

Stream.of(1,2,3,4).forEach(a->{return a.equals(1);});//line 2
ernest_k:

En ce qui concerne pourquoi les premières lignes des travaux: il y a une explication dans le cahier des charges :

D'une manière générale, un lambda de la forme () -> expr, où exprest une expression de déclaration, est interprété comme () -> { return expr; }ou () -> { expr; }, selon le type de cible.

Le vient ci-dessus avec l'exemple suivant (bonne coïncidence, ce qui est très similaire à votre exemple):

// Consumer has a void result
java.util.function.Consumer<String> c = s -> list.add(s);

Cela signifie simplement que le compilateur ne tient pas compte du type de retour pour l'expression, comme si votre code était tout simplement ce (ce qui est valable pour une méthode void):

Stream.of(1, 2, 3, 4).forEach(a -> {
     a.equals(1);
});

Et en ce qui concerne la deuxième ligne, la spécification dit:

Un corps bloc lambda est vide compatible si chaque déclaration de retour dans le bloc a la forme return;.

Dans votre cas, cependant, {return a.equals(1);}ne répond pas à cette règle. Méthodes Void ne renvoient pas une valeur.

Un moyen facile de comprendre est de considérer que le compilateur applique des règles de validation du corps de la méthode (telle que le corps doit être compatible avec la déclaration public void accept(T t)) - comme mentionné dans le tutoriel

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=201984&siteId=1
conseillé
Classement