Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Como iterar por um forEach, removendo um objeto que contem nele evitando ConcurrentModificationException

final Collection<String> nomes = new ArrayList<>();
nomes.add("João");
nomes.add("Paulo");
nomes.add("Ana");
nomes.add("Leonardo");
nomes.forEach(nome ->  {
    if(nome.matches("Leonardo")){
        nomes.remove(nome);
    }
});
1 resposta
solução!

Olá Leonardo,

No meu ponto de vista você pode resolver esse problema de duas maneiras:

1) Criar uma nova lista contendo os elementos que você quer tirar da lista principal e depois do loop remove-los da lista.

ou 2) Usar o Iterator da lista para navegar por ela e então usar o método 'remove()' para remover aquele objeto da lista.

Eu adaptei seu código um pouco para exemplificar os dois exemplos abaixo:

            // #1
        Collection<String> nomes = new ArrayList<>();
        nomes.add("João");
        nomes.add("Paulo");
        nomes.add("Ana");
        nomes.add("Leonardo");

        List<String> nomesParaRemover = new ArrayList<>(nomes.size());
        nomes.forEach(nome ->  {
                if(nome.matches("Leonardo")){
                    nomesParaRemover.add(nome);
                }
        });

        nomes.removeAll(nomesParaRemover);

        // ou
        //#2
        nomes = new ArrayList<>();
        nomes.add("João");
        nomes.add("Paulo");
        nomes.add("Ana");
        nomes.add("Leonardo");

        Iterator<String> iterator =  nomes.iterator();
        while (iterator.hasNext()) {

            if(iterator.next().matches("Leonardo")){
                iterator.remove();
            }
        }

Eu acredito que a segunda maneira seja mais eficiente, mas não sei dizer como o iterator realiza a remoção por baixo dos panos, então fica ai algo interessante para pesquisar!

Espero ter ajudado! Um abraço!