Java 8 aquí. Buscando una manera (posiblemente basada en secuencias) "Java 8" de la sustitución y / o eliminación de un objeto fuera de un List
. Aquí está mi código:
public void applyChanges(List<Fizz> fizzes, Action action, Fizz toModify) {
int i = 0;
for (Fizz fizz : fizzes) {
i++;
if (fizz.getId() == toModify.getId()) {
switch(action) {
case Replace:
// Here we want to replace 'fizz' in the list
// with 'toModify' however order/sequence doesn't matter.
fizzes.remove(i);
fizzes.add(toModify);
break;
case Delete:
default:
// Here we just want to remove the Fizz with the matching
// ID from 'fizzes'.
fizzes.remove(i);
break;
}
}
}
}
Creo que esto se puede escribir de manera más eficiente / concisa y también de una manera tal que el apalancamiento de Java 8 arroyos / Mapas pero me parece que no puede encontrar la manera de cable de todo junto. ¿Algunas ideas?
Puesto que está utilizando void
como tipo de retorno y desea modificar la lista dada utilizando una corriente no sería la mejor solución. Usted sólo puede usar List.replaceAll()
y List.removeIf()
para resolver esto con un simple if
afirmación:
public void applyChanges(List<Fizz> fizzes, Action action, Fizz toModify) {
if (action == Action.Replace) {
fizzes.replaceAll(fizz -> fizz.getId() == toModify.getId() ? toModify : fizz);
} else {
fizzes.removeIf(fizz -> fizz.getId() == toModify.getId());
}
}
Si usted tiene más acciones que reemplazar y eliminar se puede utilizar una switch
declaración en lugar de if
.
Si realmente desea utilizar corrientes También me separar las diferentes acciones. También hay que devolver la nueva lista en su método y reasignar a la variable se pasa a este método:
public List<Fizz> applyChanges(List<Fizz> fizzes, Action action, Fizz toModify) {
if (action == Action.Replace) {
return fizzes.stream()
.map(fizz -> fizz.getId() == toModify.getId() ? toModify : fizz)
.collect(Collectors.toList());
}
return fizzes.stream()
.filter(fizz -> fizz.getId() != toModify.getId())
.collect(Collectors.toList());
}