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 :)
Booleanobjets lorsque vous avez juste besoin d'unebooleanvaleur. Bien qu'ici, la variableincludeest 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 puisquedirectoryRecordjamais la boucle ne change, vous pouvez déplacer l'Integer extension = Integer.parseInt(directoryRecord.getExtensionNumber());avant de la boucle (et passerIntegeràint).