Avec Java 8, j'ai ce code:
if(element.exist()){
// Do something
}
Je veux convertir à lambda style,
element.ifExist(el -> {
// Do something
});
avec un ifExist
méthode comme ceci:
public void ifExist(Consumer<Element> consumer) {
if (exist()) {
consumer.accept(this);
}
}
Mais maintenant j'ai d'autre cas, l'appel de:
element.ifExist(el -> {
// Do something
}).ifNotExist(el -> {
// Do something
});
Je peux écrire un similaire ifNotExist
, et je veux qu'ils sont mutuellement exclusifs (si l' exist
condition est vraie, il n'est pas nécessaire de vérifier ifNotExist
, parce que parfois, la méthode exist() prend tellement la charge de travail pour vérifier), mais je dois toujours vérifier deux fois. Comment puis-je l'éviter?
Peut-être que le "exister" mot de permettre à quelqu'un de mal comprendre mon idée. Vous pouvez imaginer que j'ai aussi besoin de quelques méthodes:
ifVisible()
ifEmpty()
ifHasAttribute()
Beaucoup de gens ont dit que c'est une mauvaise idée, mais:
Dans Java 8, nous pouvons utiliser lambda forEach au lieu d'un traditionnel for
boucle. Dans la programmation de l' for
et if
sur deux contrôles des flux. Si nous pouvons utiliser une lambda pour un for
boucle, pourquoi utiliser lambda pour if
mauvaise idée?
for (Element element : list) {
element.doSomething();
}
list.forEach(Element::doSomething);
Dans Java 8, il y a Optional
avec ifPresent, semblable à mon idée de ifExist:
Optional<Elem> element = ...
element.ifPresent(el -> System.out.println("Present " + el);
Et sur la maintenance du code et de lisibilité, que pensez-vous si j'ai le code suivant avec beaucoup de répétition simple if
clauses?
if (e0.exist()) {
e0.actionA();
} else {
e0.actionB();
}
if (e1.exist()) {
e0.actionC();
}
if (e2.exist()) {
e2.actionD();
}
if (e3.exist()) {
e3.actionB();
}
Comparez à:
e0.ifExist(Element::actionA).ifNotExist(Element::actionB);
e1.ifExist(Element::actionC);
e2.ifExist(Element::actionD);
e3.ifExist(Element::actionB);
Qui est le meilleur? Et, oups, avez-vous remarqué que dans la tradition if
code clause, il y a une erreur:
if (e1.exist()) {
e0.actionC(); // Actually e1
}
Je pense que si nous utilisons lambda, on peut éviter cette erreur!