gpt4 book ai didi

Java 8 Stream 修改可变变量

转载 作者:行者123 更新时间:2023-11-29 04:52:13 25 4
gpt4 key购买 nike

我正在尝试了解 parallelStreams 的工作原理。让我们考虑以下示例:

public class Person {
private String name;

public String getName() {
return name;
}

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

还有一个主要方法:

public static void main(String[] args) {
final Person person = new Person();
person.setName("John Doe");
List<String> myList = Arrays.asList("1","2","3","4","5","6");
myList.forEach((String element) -> {
person.setName(person.getName()+element);
System.out.println(person.getName());
});
}

结果将是:

John Doe1
John Doe12
John Doe123
John Doe1234
John Doe12345
John Doe123456

如果我将它更改为 parallelStream(),结果可能是这样的:

John Doe4
John Doe41
John Doe415
John Doe4156
John Doe41562
John Doe415623

是否可以附加少于 6 位数字?例如,如果两个线程在开始时同时读取值 John Doe。一个线程附加“1”,另一个线程附加“2”。再次设置名称时,其中一个会覆盖另一个。

编辑:

我问的原因:我有一个字符串,里面有一些占位符。我编写了自己的 Spliterator 来提取占位符。此外,我有一张 map ,它提供了占位符的替代品。所以我应用了一个过滤器来检查每个占位符是否有替换。之后我更换了字符串。我认为如果在并行模式下运行,在最后一步中替换字符串将无法正常工作。

最佳答案

是的,这是可能的。您只需要在 Stream 中添加更多元素以使其更频繁地发生。

考虑一下:

public static void main(String[] args) {
final Person person = new Person();
person.setName("John Doe");
List<String> myList = IntStream.rangeClosed('a', 'z').mapToObj(c -> String.valueOf((char) c)).collect(Collectors.toList());
myList.parallelStream().forEach((String element) -> {
person.setName(person.getName()+element);
System.out.println(person.getName());
});
}

这与您的代码相同,但这次我们附加了字母表中的所有小写字母。我刚刚运行了它,最后的结果是:

John Doengopqrswxyztuvabchijkl
John Doengopqrswxyztuvabchijklm
John Doengopqrswxyztuvabcd
John Doengopqrswxyztuvabcde
John Doengopqrswxyztuvabcdef

这意味着您所描述的效果肯定会发生。

我们需要添加更多元素的原因只是为了增加这种效果发生的可能性。


重要说明:您没有在问题中说明为什么您想要这个。但请记住,改变外部变量通常是您首先要避免的事情。

关于Java 8 Stream 修改可变变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35016842/

25 4 0