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
Boolean
objetos cuando solo necesite unboolean
valor. Aunque aquí, la variableinclude
es completamente obsoleta. Cuando el único cambio posible es detrue
afalse
, 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 comodirectoryRecord
nunca cambia en el bucle, puede moverInteger extension = Integer.parseInt(directoryRecord.getExtensionNumber());
antes del bucle (y cambiarInteger
aint
).Respuestas:
Lo haría con una
Range
clase 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
noneMatch
cuando 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> ranges
se puede cambiar para eliminar puntos de losSet<String> extensionsToExclude
que 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