Java 8 Stream 通过相同的昂贵方法调用进行过滤和分组

标签 java java-8 java-stream

我正在寻找一种以干净的方式优化 Stream 处理的方法。

我有这样的东西:

try (Stream<Path> stream = Files.list(targetDir)) {
    Map<String, List<Path>> targetDirFilteredAndMapped = stream.parallel()                                                                                                
        .filter(path -> sd.containsKey(md5(path)))                                                                                                                    
        .collect(Collectors.groupingBy(path -> md5(path)));
} catch (IOException ioe) { // manage exception }

而且由于 md5 函数非常昂贵,我想知道是否有一种方法可以让每个文件只调用一次。

有什么建议吗?

最佳答案

您可以创建一些 PathWrapper包含 Path 的对象实例及其对应的 md5(path) .

public class PathWrapper
{
    Path path;
    String md5; // not sure if it's a String
    public PathWrapper(Path path) {
        this.path = path;
        this.md5 = md5(path);
    }
    public Path getPath() {return path;}
    public String getMD5() {return md5;}
}

然后将您的流映射到 Stream<PathWrapper> :

try (Stream<Path> stream = Files.list(targetDir)) {
    Map<String, List<Path>> targetDirFilteredAndMapped =
        stream.parallel() 
              .map(PathWrapper::new)
              .filter(path -> sd.containsKey(path.getMD5()))                                                                                                                    
              .collect(Collectors.groupingBy(PathWrapper::getMD5,
                                             Collectors.mapping(PathWrapper::getPath,
                                                                Collectors.toList())));
} catch (IOException ioe) { /* manage exception */ }

关于Java 8 Stream 通过相同的昂贵方法调用进行过滤和分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39764562/

相关文章:

java - 哪些做法是错误的? (Java 服务器/套接字编程)

java - 如何在Java中获取 "last saved by"Office文件属性

Java 流 - 映射列表到简化的映射列表

java - 调用 supplyAsync 时尝试并捕获

Java - Objective C - 针对每个循环问题

java - 修改 String/Integer 对象并检查它是否影响以该对象作为参数的类对象

Java 将作为 Rest API 响应返回的 pdf 转换为文本

java - 在 Java 8 中使用Optional.empty 默认可选 orElse

java - 使用 Java Streams 从字符串数字列表中查找最大数字

java - map 上的流不保存 .map 更改