我有一个对象数组,我正在使用 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/