gpt4 book ai didi

java - Completable Future - 使用 Completable Future 我正在尝试来自两个不同文件的数据

转载 作者:行者123 更新时间:2023-12-02 01:03:30 33 4
gpt4 key购买 nike

我正在尝试从两个不同的文件中读取数据,一个是 csv 格式,另一个文件是 xml 数据。使用completeFuture 我正在尝试从两个文件异步读取数据。我收到类型转换错误。请让我知道我是否遵循正确的方法在下面的代码中使用completefuture对象

异常(exception):

java.lang.ClassCastException: class java.util.ArrayList cannot be cast to class java.util.function.Supplier (java.util.ArrayList and java.util.function.Supplier are in module java.base of loader 'bootstrap')

从主线程读取数据的代码

    CompletableFuture<Object> csvdata = CompletableFuture.supplyAsync((Supplier<Object>) processdatacsv());

CompletableFuture<Object> xmldata1 = CompletableFuture.supplyAsync((Supplier<Object>) processxmldata());
List<String[]> csvfiledata = null;
if (csvdata.isDone())
csvfiledata = (List<String[]>) csvdata.get();

List<String[]> xmlfiledata = null;
if (xmldata1.isDone())
xmlfiledata = (List<String[]>) xmldata1.get();

private List<String[]> processdatacsv() {
CSVReader reader = null;
Resource resource1 = new ClassPathResource("sample.csv");
try {
String csvFile = resource1.getFile().toString();
reader = new CSVReader(new FileReader(csvFile));

return reader.readAll();
} catch (Exception e) {
LOGGER.error("Error while process csv records");
return null;
}
}

private List<String[]> processxmldata() {
Resource resource = new ClassPathResource("sample.xml");
File file;
try {
file = resource.getFile();
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder;
dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(file);
doc.getDocumentElement().normalize();
NodeList nodeList = doc.getElementsByTagName("record");
System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
List<String[]> dataList = new ArrayList<String[]>();
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);

if (node.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) node;
String[] data = new String[3];
data[0] = eElement.getAttribute("reference").toString();
data[1] = eElement.getElementsByTagName("Number").item(0).getTextContent().toString();
data[2] = eElement.getElementsByTagName("des").item(0).getTextContent().toString();
}
}
return dataList;
} catch (Exception e) {

LOGGER.error("Error while process csv records");
return null;
}
}

最佳答案

对于CompletableFuture.supplyAsync你需要一个Supplier 。这不能通过将列表强制转换为类型 Supplier<Object> 来完成。 。正确的做法是这样的:

CompletableFuture<List<String[]>> xmldata1 = CompletableFuture.supplyAsync(() -> processxmldata());

使用 Supplier 的原因是评估不能立即从构建 Supplier 的语句开始。 Future将在异步线程中开始评估。

以后,如果你确实需要结果,就必须等待。最简单的方法就是:

xmlfiledata = xmldata1.get(); 

查看 get 方法的 javadoc。

关于java - Completable Future - 使用 Completable Future 我正在尝试来自两个不同文件的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60342978/

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