繁体   English   中英

如何使用 Java lambda 和流迭代 MultipartFile 数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM