Copiar um ArrayList para outro

3 respostas Resolvido
java
W

Olá, leio alguns dados e crio um arraylist (List).

Necessito copiar o valor deste arraylist para outro, pois o original eu utilizo para algumas validações, enquanto o segundo eu agrupo e faço outras validações.

Todos os métodos que usei apenas apontam para o mesmo objeto e quando eu altero 1 todos são alterados.

Métodos que  tentei utilizar:

* Collections.copy(lstRecebimentosAgrupados, lstRecebimentosCarregados);

* List lstRecebimentosAgrupados = new ArrayList<>(lstRecebimentosCarregados);

* lstRecebimentosAgrupados.addAll(lstRecebimentosCarregados);

Caso alguém já tenha passado por isso e puder me ajudar eu fico extremamente grato, seja com uma nova contribuição ou apontando o que eu posso estar fazendo errado.

3 Respostas

darlan_machado
Solucao aceita

Sim, todos as maneiras acima fazem exatamente o que você relatou, apontam para o(s) mesmo(s) objeto(s).
Como resolver?
Você precisa criar nova(s) instância(s) de objeto(s) para cada objeto dentro da lista e, então, incluir este na nova lista.

List<Blablabla> blas = new ArrayList<>();
for(Blablabla bla : blablablas) {
    Blablabla b = new Blablabla();
    b.setAttribute(bla.getAttribute());
    blas.add(b);
}

Assim você tem uma cópia de objetos distintos.

wldomiciano

Vc poderia criar uma forma de criar um novo objeto com base em um outro já existente. Há varias formas de fazer isso. Abaixo eu fiz um exemplo usando um constructor.

class Recebimentos {
  private String name;
  private LocalDate date;

  Recebimentos(String name, String date) {
    this.name = name;
    this.date = LocalDate.parse(date);
  }

  Recebimentos(Recebimentos recebimento) {
    this.setName(recebimento.name);
    this.setDate(recebimento.date.toString());
  }

  void setName(String name) {
    this.name = name;
  }

  void setDate(String date) {
    this.date = LocalDate.parse(date);
  }

  @Override
  public String toString() {
    return String.format("{ name: %s, date: %s }", this.name, this.date);
  }
}

Dessa forma vc poderia usar Streams pra fazer essa cópia pra vc. Aqui esta um exemplo de como vc faria:

public class Main {
  public static void main(String[] args) {
    List<Recebimentos> carregados = List.of(
        new Recebimentos("Paulo", "2019-12-02"),
        new Recebimentos("João", "2019-12-12"),
        new Recebimentos("Pedro", "2019-12-22")
    );

    List<Recebimentos> agrupados = carregados.stream()
                                             .map(Recebimentos::new)
                                             .collect(Collectors.toList());

    agrupados.get(0).setName("xxxx");
    agrupados.get(1).setDate("1900-01-10");

    System.out.println(carregados);
    System.out.println(agrupados);
  }
}
W

@darlan_machado e @wldomiciano, muito obrigado pela ajuda e atenção, no momento e pelo meu conhecimento, a forma de implementação que usarei vai ser a do @darlan_machado, mas estudarei a forma que vc me apresentou @wldomiciano.

Muito obrigado pela atenção e ajuda, espero um dia ter o mesmo conhecimento que vocês <3.
Tenham uma ótima semana!

Criado 26 de dezembro de 2019
Ultima resposta 27 de dez. de 2019
Respostas 3
Participantes 3