Java 8 Streaming Filter&Collect是否返回对列表中相同对象的引用?

Ace*_*Ace 1 java reference java-stream

例如,考虑下面的代码

List<Reference> references = context.getReferences()
                .stream()
                .filter(ref -> ref.getCondition() == SOMETHING_DESIRABLE)
                .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

现在,如果我改变引用列表中的每个引用,它是否会反映在原始context.references中?

SLa*_*aks 6

在Java中没有通用的方法来克隆对象.

根本不可能自动返回不同的实例.

  • 深度克隆对象没有通用的方法. (2认同)

ACV*_*ACV 5

你的问题的答案是肯定的。如下图所示:

  private void run() {

    List<Ref> original = new ArrayList<>();
    original.add(new Ref(1, "A"));
    original.add(new Ref(2, "B"));
    original.add(new Ref(3, "C"));

    System.out.println("Original: " + original);
    // Original: [Ref{id=1, name='A'}, Ref{id=2, name='B'}, Ref{id=3, name='C'}]

    List<Ref> results = original.stream().collect(Collectors.toList());

    System.out.println("Aggregated: " + results);
    // Aggregated: [Ref{id=1, name='A'}, Ref{id=2, name='B'}, Ref{id=3, name='C'}]

    results.forEach(r -> r.name = r.name + "CHANGED");

    System.out.println("Original: " + original);
    //Original: [Ref{id=1, name='ACHANGED'}, Ref{id=2, name='BCHANGED'}, Ref{id=3, name='CCHANGED'}]

  }
Run Code Online (Sandbox Code Playgroud)