java - 重构使用流 API 的方法

标签 java list dictionary java-8 java-stream

我目前被告知要计算在某些服务器上挂起的所有 .sql 文件。手动解决这个非常基本的任务不是一种选择,相反,我编写了一些代码来使用 SimpleFileVisitor<Path>并将找到的所有 sql 文件及其父路径存储在 Map<Path, List<Path>> 中.

现在我想接收找到的与其位置无关的 sql 文件总数。我让它与增强的 for 一起工作循环(几乎是经典方式):

public int getTotalAmountOfSqlFiles(Map<Path, List<Path>> sqlFilesInDirectories) {
    int totalAmount = 0;
        
    for (Path directory : sqlFilesInDirectories.keySet()) {
        List<Path> sqlFiles = sqlFilesInDirectories.get(directory);
        totalAmount += sqlFiles.size();
    }
        
    return totalAmount;
}

现在的问题是,我如何使用流 API 执行相同的操作?

我无法让可编译代码正常工作,这显然没有做错事。
不幸的是,下面这行对我来说是一个好主意,但对编译器来说不是。

totalAmount = sqlFilesInDirectories.entrySet().stream().map(List::size).sum();

编译器说

Cannot infer type argument(s) for <R> map(Function<? super T,? extends R>

有谁知道我做错了什么(并可能提供一些使用解决方案的受过教育的流 API)?

最佳答案

当所需的总和仅为值中包含的列表大小时,不确定为什么人们会在此处涉及 keySet。只需对所有值的大小求和即可。

return sqlFilesInDirectories.values().stream().mapToInt(List::size).sum();

甚至 for 循环版本也应该是这样的,

for (List<Path> list : sqlFilesInDirectories.values()) {
    totalAmount += list.size();
}

因为遍历键集然后从映射中获取值并不是真正需要的,而且在性能方面也不会更好。

关于java - 重构使用流 API 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55356349/

相关文章:

java - 在 Xpages 中从服务器端 javascript/java 调用 C 代码?

java - 如何使用 REST 服务上传非 ASCII 文件名的文件?

list - 从列表中删除项目

python - Pandas:通过查找索引替换一系列值

java - 使用 jackson-dataformat-csv 获取 csv header

使用堆栈空间的 Java 数组

c - 从文本文件读取行到结构 C

c - C中的通用列表使用void指针

python 访问字典有两个键,只使用一个键

swift - 在 Swift 中将字典值转换为不同的类型