utiliser des if-else dans java 8 expression lambda
J'ai une déclaration à java-7 et c'est un travail de l'amende:
Character cha = new Character(',');
String ncourseIds = null;
String pastCourseIds = null;
for (EquivalentCourse equivalentCourse : equivalentCourses) {
if(equivalentCourse.getNcourse() != null){
ncourseIds += equivalentCourse.getNcourse().getId()+ ",";
} else if(equivalentCourse.getPastCourse() != null) {
pastCourseIds +=equivalentCourse.getPastCourse().getId()+",";
}
}
if(!ncourseIds.isEmpty() &&cha.equals(ncourseIds.charAt(ncourseIds.length()-1))) {
ncourseIds = ncourseIds.substring(0, ncourseIds.length()-1);
}
if(!pastCourseIds.isEmpty()&& cha.equals(pastCourseIds.charAt(pastCourseIds.length()-1))) {
pastCourseIds = pastCourseIds.substring(0,pastCourseIds.length()-1);
}
Maintenant je veux convertir mon code pour Stream
& collect
dans java 8, je mets en œuvre la moitié de mes affaires sur filtre pas null Ncourse
:
equivalentCourses.stream().filter(obj -> obj.getNcourse() != null )
.map(obj -> obj.getNcourse().getId()).collect(Collectors.joining(","));
mais je ne sais pas à mettre en œuvre, c'est else-statement
. toute aide?
- Pourquoi utilisez-vous
Character
au lieu dechar
? Cela rend votre code plus difficile à lire et le gaspillage de ressources. Cependant, vous n'avez pas besoin, si vous remplacez!ncourseIds.isEmpty() && ha.equals(ncourseIds.charAt(ncourseIds.length()-1))
avec un simplencourseIds.endsWith(",")
et de la même manière,!pastCourseIds.isEmpty() && cha.equals(pastCourseIds.charAt(pastCourseIds.length()-1))
avecpastCourseIds.endsWith(",")
. Pour recueillir des deux chaînes avec des cours d'eau, vous pouvez simplement effectuer deux flux d'opérations. - déjà dit: l'utilisation de deux flux d'opérations (un pour
getNcourse() != null
et un pourgetNcourse() == null && getPastCourse() != null
).
Vous devez vous connecter pour publier un commentaire.
Comme un flux d'appel chaîne complexe des deux ruisseaux - en évitant les branches conditionnelles.
C'est aussi un code en se concentrant sur les deux chaînes, avec une efficacité de rejoindre.
Par ailleurs, si c'est pour une chaîne SQL, vous pouvez utiliser un PreparedStatement avec un Tableau.
Embellissement comme indiqué par @Holger:
.map(EquivalentCourse::getNcourse) .filter(Objects::nonNull)
, deuxième volet de l'op:.filter(equivalentCourse -> equivalentCourse.getNcourse() == null) .map(EquivalentCourse::getPastCourse) .filter(Objects::nonNull)
.Vous pourriez groupe en condition puis reconfigurer:
Ruisseau premier groupe par condition, vous devez utiliser
equivalentCourse.getNcourse() != null
deuxième remapper les collections de la valeur à la chaîne. Vous pouvez introduire:et changement
e -> e.getKey() ? "Present" : "Past"
enum en fonction de la solution.Edit:
Solution pour
else if
:if-else
déclaration, mais la question est à propos deelse-if
déclaration. Dans ce cas, vous devez effectuer deux flux de l'opération.Mise à jour
Pour ajouter une alternative, voici ce à quoi ressemblera le code pour faire le travail avec deux
filter()
opérations. Remarque, cela a de l'impact d'une itération sur l'ensemble de la collection un deuxième temps, ce qui peut avoir un impact sur les performances, si cela est une grande collection.Je suis aussi allé de l'avant et simplifiée de la logique en ce qui concerne la chaîne de rejoindre. Corrigez-moi si j'ai raté quelque chose là-bas.
Réponse originale à cette question
Pour votre cas d'utilisation, il peut faire le plus de sens pour utiliser le
forEach()
lambda. Ce sera le moyen le plus facile pour faire la traduction.Vous pouvez réécrire le code à l'aide de
filter()
expressions, mais il va me falloir un plus gros re-travail de la logique dans les instructions conditionnelles, qui présente le risque que vous pourriez casser quelque chose si ce n'est pas bien testé. La logique des changements sont exactement ce que @Holger et @Ole V. V. de référence dans leurs observations sur la question d'origine.Si vous utilisez
forEach()
ou les filtres, les lambdas ne peut pas accéder non-final variables dans l'expression, c'est pourquoi j'ai ajouté lefinal StringBuilder
variable en dehors de la portée de la boucle.