Filtrar una lista <Objeto> basado en List <String> dentro de cada objeto

akapti:

Tengo una List<Release>y cada uno ReleasecontieneList<Attachment>

Quiero eliminar todos los archivos adjuntos de cada uno List<Attachment>, excepto Xy Yescribir. 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 removeIfpara 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 removeIfcomplejidad del tiempo es O (n ^ 2)porque debajo de ella utiliza iterador y del removemétodo.

Como alternativa se puede utilizar forEachdirectamente 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.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=230011&siteId=1
Recomendado
Clasificación