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 :)
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
).