gpt4 book ai didi

java - 在java中并行构造XML元素

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

我有一个对象数组,我正在使用 java 构建一个 xml 文档,如下所示 -

Object[] arr = fetchData();
Document newDoc =DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Element rootElement = newDoc.createElement("company");
for(int i=0;i<arr.length();i++)
{
Element staff = new Element("staff");
staff.setAttribute(new Attribute("id", i));
staff.addContent(new Element("firstname").setText(arr[i].getFirstName()));
staff.addContent(new Element("lastname").setText(arr[i].getLastName()));
staff.addContent(new Element("nickname").setText(arr[i].getNickName()));
staff.addContent(new Element("salary").setText(arr[i].getSalary()));
............
............
............
............
............
rootElement.appendChild(staff);
}
newDoc.appendChild(rootElement);

生成的 xml 将具有以下形式 -

<company>
<staff id="1">
<firstname>Foo</firstname>
<lastname>Bar</lastname>
<nickname>FB</nickname>
<salary>999999</salary>
............
............
............
............
</staff>
......
......
</company>

上述解决方案适用于小型数组,但当数组大小增加时,由于上述代码的顺序处理,需要很长时间才能处理。有什么方法可以通过使用 java 8 Stream 并行处理或 java 中的线程来并行处理人员元素的构造?

使用 CompletableFuture 的更新解决方案:

Object[] arr = fetchData();
Document newDoc =DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Element rootElement = newDoc.createElement("company");
List<CompletableFuture<Element>> futureElements = new ArrayList<>();
for (int x = 0; x < arr.length(); x++) {
Object e = arr[x];
CompletableFuture<Element> f = CompletableFuture.supplyAsync(() -> getElement(newDoc, e));
futureElements.add(f);
}

for (CompletableFuture<Element> e : futureElements)
rootElement.appendChild(e.get());

newDoc.appendChild(rootElement);

最佳答案

您可以使用的是 CompletableFuture

这样你就可以在一个新线程中生成所有的“staff”元素,然后等待它们全部完成并添加它们

List<CompletableFuture<Element>> futureElements = new ArrayList<>()
for(int x = 0; x < arr.length; x++){
//getElement(arr[x]) is the get staff element logic
CompletableFuture<Element> f = CompletableFuture.supplyAsync(() -> getElement(arr[x]))
futureElements.add(f);
}

CompletableFuture<Void> allOf = CompletableFuture.allOf(futureElements.toArray(new CompletableFuture[0]))

现在您可以修改 allOf CompletableFuture,或者您可以使用诸如 thenAccept() 之类的东西来创建一个新线程,该线程将在所有其他线程完成后立即启动,或者执行 .get() 以连接回主线程。

如果你执行 .get() 那么你可以做类似的事情

futureElements.forEach(f -> rootElement.append(f.get()));

关于java - 在java中并行构造XML元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43230763/

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