gpt4 book ai didi

java - 当使用java 8 map、filter和collect时,它会创建新对象还是修改现有对象?

转载 作者:行者123 更新时间:2023-12-02 12:58:52 25 4
gpt4 key购买 nike

我有下面的代码,我在 map 中使用过滤器和替换函数进行过滤,然后进行收集以替换原始数组。我的问题是 inputArr 中的原始对象是否被丢弃并创建新对象,或者当我进行收集时相同的对象是否被修改?

public static void test () {
inputArr.stream().filter(s -> toRemove.contains(s)).
forEach(u -> u.replaceAll("2","X"));
inputArr = inputArr.stream().map(x -> filterReplace(x,toRemove)).collect(Collectors.toList());
System.out.println(inputArr);
}

static String filterReplace(String input, Set<String> toRemove) {
if (toRemove.contains(input)) {
return "X";
}
else
return input;
}

最佳答案

好的,如果我理解正确的话,您想了解 collectforEach 是否修改了原始源。您可以自己轻松地进行测试。我们来一个小类来测试一下:

static class MyObject {
private int value;

public MyObject(int value) {
super();
this.value = value;
}

public int getValue() {
return value;
}

public void setValue(int value) {
this.value = value;
}

@Override
public String toString() {
return System.identityHashCode(this) + " " + value;
}
}

还有一个小用法,首先是 forEach:

    MyObject first = new MyObject(1);
MyObject second = new MyObject(2);
List<MyObject> list = Arrays.asList(first, second);

System.out.println(list);
list.stream().forEach(x -> x.setValue(x.getValue() + 1));
System.out.println(list);

如果您打印这些:

[1018081122 1, 242131142 2]
[1018081122 2, 242131142 3]

请注意,它具有相同的相同的哈希 - 列表内的对象没有更改。引用文献是相同的。您更改的是对象的内部

collect 也会发生同样的事情:

    System.out.println(list);
List<MyObject> result = list.stream().filter(x -> x.getValue() > 0).collect(Collectors.toList());
System.out.println(result);

到达这里主要有两件事。 Streams 迭代现有源,如果在流中更改某些属性(如 forEach 示例),则您更改了源

您不应更改流的来源,因为文档禁止这样做。这称为无干扰副作用

关于java - 当使用java 8 map、filter和collect时,它会创建新对象还是修改现有对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44351656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com