akapti:
Tengo una List<Release>
y cada uno Release
contieneList<Attachment>
Quiero eliminar todos los archivos adjuntos de cada uno List<Attachment>
, excepto X
y Y
escribir. Quiero lograr esto en Java 8.
He probado el código de abajo. Pero no está funcionando.
releases = releases.stream()
.filter(release -> release.getAttachments().stream()
.anyMatch(att -> AttachmentType.X_TYPE.equals(att.getAttachmentType())
|| AttachmentType.Y_TYPE.equals(att.getAttachmentType())))
.collect(Collectors.toList());
Michalk:
Se podría iterar sobre la lista de liberación y uso removeIf
para eliminar los archivos adjuntos no deseados:
Predicate<Attachment> isNotXorY = attachment -> !(AttachmentType.X_TYPE.equals(attachment.getAttachmentType()) || AttachmentType.Y_TYPE.equals(attachment.getAttachmentType()));
releases.forEach(release -> release.getAttachments().removeIf(isNotXorY));
Como en punta a cabo por @roookeee removeIf
complejidad del tiempo es porque debajo de ella utiliza iterador y del remove
método.
Como alternativa se puede utilizar forEach
directamente en la recogida y modificar todos Release
:
Predicate<Attachment> isXorY = attachment -> AttachmentType.X_TYPE.equals(attachment.getAttachmentType()) || AttachmentType.Y_TYPE.equals(attachment.getAttachmentType());
releases.forEach(release -> {
List<Attachment> filteredAttachments = release.getAttachments()
.stream()
.filter(isXorY)
.collect(Collectors.toList());
release.setAttachments(filteredAttachments);
});
Esta corriente anidada se podía extraer hasta cierto método de ayuda para una mejor legibilidad.