Java 8 en option ajouter retour en résultat uniquement si option.isPresent
J'ai un morceau de code où une interface dispose d'une Option de retour de la méthode et certaines des classes qui l'implémentent retourner quelque chose, d'autres ne le font pas.
Dans un effort pour embrasser cette brillante "null killer", voici ce que j'ai essayé:
public interface Gun {
public Optional<Bullet> shoot();
}
public class Pistol implements Gun{
@Override
public Optional<Bullet> shoot(){
return Optional.of(this.magazine.remove(0));
}//never mind the check of magazine content
}
public class Bow implements Gun{
@Override
public Optional<Bullet> shoot(){
quill--;
return Optional.empty();
}
}
public class BallisticGelPuddy{
private Gun[] guns = new Gun[]{new Pistol(),new Bow()};
private List<Bullet> bullets = new ArrayList<>();
public void collectBullets(){
//here is the problem
for(Gun gun : guns)
gun.shoot.ifPresent(bullets.add( <the return I got with the method>)
}}
Je prie de m'excuser pour la façon dont idiot cet exemple est.
Comment puis-je vérifier le retour, je viens de recevoir et d'ajouter que si présente, à l'aide facultative?
P. S. est-il un véritable intérêt à l'Option qui est if(X != null) ne pouvait pas le faire?
- "P. S. est-il un véritable intérêt à l'Option qui est if(X != null) ne pouvait pas le faire?" - Je suis un grand fan de Facultatif, mais en même temps, je considère qu'il est presque une forme de commentaire. Lorsque vous voyez quelque chose de type Facultatif, vous devez savoir automatiquement qu'il pourrait ne pas être là; cependant, la plupart des valeurs que peut contenir la valeur null ne doit jamais, il n'est donc pas à la pratique générale de l'entourent absolument chaque de référence avec la valeur null contrôles.
- Je ne veux pas faire cela dans une sorte de bain de sang, mais je suis d'accord avec ce gars ici: quel est le point? Je suis d'accord sur l'impression "Oh, une option! Mieux être sûr que, en effet, il existe", mais je pense qu'il aurait été possible de faire un peu mieux.
- Donc, une partie de l'avantage que je vois est la clarté. Chaque fois que vous voyez
Optional
arriver attribué unnull
valeur, vous savez que c'est mal, et peut se sentir justifié dans la fixant. Quand vous voyez nulle arriver affecté à une autre valeur... eh bien, qui sait, peut-être que c'est approprié. J'ai aussi l'impression que, du point de vue philosophique, "Chose qui est peut-être rien" ne devrait vraiment être d'un type différent de celui de "Chose qui doit être quelque chose." Il pourrait être mieux fait, mais seulement si elle faisait partie de la langue à partir de la base... et, de l'OMI, Java est sur une partie de porc de trois pièces de rouge à lèvres.
Vous devez vous connecter pour publier un commentaire.
Je vois où vous allez - lorsqu'un projectile (peut-être un meilleur nom de la classe que
Bullet
) passe parBallisticGelPuddy
, soit il est bloqué ou qu'il n'a pas. Si ça coince, il s'accumule dansBallisticGelPuddy
.Nous allons réécrire le code, si nous étions à l'aide de
null
vérifie plutôt:Assez simple, non? Si elle existe, nous tenons à ajouter dans.
Nous allons ajouter l'option style en:
Efficacement ces deux choses à accomplir la même chose, bien que le
Optional
approche est terser.Dans ce scénario, il n'y a vraiment pas de différence entre les deux approches, puisque vous êtes toujours à la vérification de l'existence.
Optional
est destinée à se prémunir contre les erreurs lors de la manipulation denull
et vous permet de exprimer une plus fluide chaîne d'appel, mais d'envisager la faisabilité d'utiliser desOptional
dans ce scénario. Il ne semble pas totalement nécessaire pour ce cas.Je pense que vous voulez:
Ou vous pouvez passer avec le (code) de la boucle de trop:
Mais c'est plus laide.
Avec le flux de données de l'API, vous pouvez le faire:
Malheureusement, dans Java 8, il n'y a pas de méthode qui convertit les Options de Flux, alors vous devez écrire vous-même.
Voir À l'aide de Java 8, en Option, avec Stream::flatMap
Je veux mettre cette référence pour l'avenir, pour quelqu'un déclenchement à un problème similaire à la mienne. Si vous souhaitez accéder à des méthodes de ce que vous avez tout juste de retour, le cas échéant: