J'essaie de filtrer une ressource et d'exclure certains éléments en fonction d'un champ. Pour exclure, j'ai un ensemble (qui contient un identifiant qui doit être exclu) et une liste (il contient plusieurs plages d'identifiants qui doivent être exclus). J'ai écrit la logique ci-dessous et je ne suis pas satisfait de la logique du 2ème filtre. Y a-t-il une meilleure façon de le faire avec Java 8? Je dois également faire de même pour inclure les plages.
Set<String> extensionsToExclude = new HashSet<>(Arrays.asList("20","25","60","900"));
List<String> rangesToExclude = new ArrayList<>(Arrays.asList("1-10","20-25","50-70","1000-1000000"));
return directoryRecords.stream()
.filter((directoryRecord) -> !extensionsToExclude.contains(directoryRecord.getExtensionNumber()))
.filter((directoryRecord -> {
Boolean include = true;
for(String s : rangesToExclude) {
String [] rangeArray = s.split("-");
Integer extension = Integer.parseInt(directoryRecord.getExtensionNumber());
if(extension <= Integer.parseInt(rangeArray[0]) && extension >= Integer.parseInt(rangeArray[1])) {
include = false;
}
}
return include;
}))
.collect(Collectors.toList());
Merci :)
java
lambda
java-8
java-stream
Yadvendra Rathore
la source
la source
Boolean
objets lorsque vous avez juste besoin d'uneboolean
valeur. Bien qu'ici, la variableinclude
est entièrement obsolète. Lorsque le seul changement possible est detrue
àfalse
, vous pouvez remplacerinclude = false;
parreturn false;
car le résultat final a déjà été déterminé. Ensuite, lereturn include;
à la fin peut être remplacé parreturn true;
et la déclaration de variable supprimée. Et puisquedirectoryRecord
jamais la boucle ne change, vous pouvez déplacer l'Integer extension = Integer.parseInt(directoryRecord.getExtensionNumber());
avant de la boucle (et passerInteger
àint
).Réponses:
Je le ferais avec une
Range
classe personnalisée , quelque chose comme:Ce qui rendra quelque chose comme ça possible:
Personnellement, je trouve que votre premier filtre est assez bon pour être conservé tel quel.
la source
noneMatch
lorsque nous parlonsrangesToExclude
? Et je suppose qu'il pourrait y avoir une solution encore plus élégante avec unTreeSet<Range>
...Je suggérerais similaire à la réponse de ernest_k avec
Range
.Mais dans cette approche, vous pouvez utiliser les deux collections pour créer
List<Range>
(cela"20"
peut être traité comme"20-20"
) et modifier la condition de filtre pour utiliser la négation avecanyMatch
.MISE À JOUR
La création de
List<Range> ranges
peut être modifiée pour supprimer les points deSet<String> extensionsToExclude
la plage créée à partir deList<String> rangesToExclud
. Les plages inutiles ne seront alors pas créées.la source
vous pouvez effectuer une pause anticipée si la condition de plage est vraie, plutôt que d'attendre que toutes les entrées soient évaluées.
sinon, renvoyez simplement false après la boucle for.
la source