Estoy tratando de filtrar un recurso y excluir algunos elementos basados en un campo. Para excluir, tengo un conjunto (que contiene una identificación que debe excluirse) y una lista (contiene múltiples rangos de identificadores que deben excluirse). Escribí la lógica a continuación y no estoy satisfecho con la lógica del segundo filtro. ¿Hay alguna manera mejor de hacerlo con Java 8? Necesito hacer lo mismo para incluir rangos también.
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());
Gracias :)
java
lambda
java-8
java-stream
Yadvendra Rathore
fuente
fuente

Booleanobjetos cuando solo necesite unbooleanvalor. Aunque aquí, la variableincludees completamente obsoleta. Cuando el único cambio posible es detrueafalse, puede reemplazarinclude = false;conreturn false;ya que el resultado final ya se ha determinado. Entonces,return include;al final puede ser reemplazado porreturn true;y la declaración de variable eliminada. Y comodirectoryRecordnunca cambia en el bucle, puede moverInteger extension = Integer.parseInt(directoryRecord.getExtensionNumber());antes del bucle (y cambiarIntegeraint).Respuestas:
Lo haría con una
Rangeclase personalizada , algo como:Lo que hará posible algo como esto:
Personalmente, creo que su primer filtro es lo suficientemente bueno como para preservarlo tal como está.
fuente
noneMatchcuando estamos hablandorangesToExclude? Y supongo que podría haber una solución aún más elegante con unTreeSet<Range>...Sugeriría una respuesta similar a la de ernest_k con
Range.Pero en este enfoque puede usar tanto la colección para crear
List<Range>(esto"20"se puede tratar como"20-20") y cambiar la condición del filtro para usar la negaciónanyMatch.ACTUALIZAR
La creación de
List<Range> rangesse puede cambiar para eliminar puntos de losSet<String> extensionsToExcludeque están en el rango creado a partir deList<String> rangesToExclud. Entonces no se crearán rangos innecesarios.fuente
puede hacer un descanso temprano si la condición del rango es verdadera, en lugar de esperar a que se evalúen todas las entradas.
de lo contrario, solo devuelve false después del ciclo for.
fuente