[英]How to iterate over MultipartFile array using Java lambda and streams
下面是我将一些文件附件上传到外部存储的代码。 我想知道是否有一种方法可以避免以下方法中的 for 循环来迭代 MultipartFile[] 数组,以便使用 java 流和 lambda 函数完成所有操作。 希望有更好的方法来实现以下目标
public void uploadMyFiles(MultipartFile[] multipartFiles, String path) throws Exception {
ConcurrentHashMap<String, String> sMap = new ConcurrentHashMap<>();
ExecutorService myExecutor = Executors.newFixedThreadPool(5);
for (MultipartFile multipartFile : multipartFiles) {
CompletableFuture<String> future = CompletableFuture
.supplyAsync(() -> uploadMyFile(multipartFile, path), myExecutor );
String status = future.get(10, TimeUnit.SECONDS);
sMap.put(multipartFile.getOriginalFilename(), status);
}
}
private String uploadMyFile(MultipartFile file, String fpath){
return null;
}
private static Map<String, String> retrieveCompletableFuture(
CompletableFuture<Map<String, String>> futureMap) {
try {
return futureMap.get(10, TimeUnit.SECONDS);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
e.printStackTrace();
}
return null;
}
public void uploadMyFiles(MultipartFile[] multipartFiles) throws Exception {
ExecutorService executor = Executors.newFixedThreadPool(5);
String s3Path = "/demo-mypath/";
ExecutorService myExecutor = Executors.newFixedThreadPool(5);
Arrays.stream(multipartFiles)
.map(
multipartFile ->
CompletableFuture.supplyAsync(() -> uploadMyFile(multipartFile, s3Path), executor))
.map(cfuture -> retrieveCompletableFuture(cfuture))
.map(Map::entrySet)
.collect(Collectors.toMap(Entry::getKey, Entry::getValue));
}
我已经将您的实现完全实现为 lambdas。 请注意,这里的 future.get() 是一个阻塞调用,这意味着它们是按顺序执行的(因此不需要 ConcurrentHashMap)。
如果您正在寻找并行操作,则需要一个 parallelStream。 可以提交任务并等待。 在这种情况下,您需要使用 Collectors.toConcurrentMap 来收集结果。 (在将流合并到单个 Map 时要非常小心可能出现的竞争条件)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.