我目前被告知要计算在某些服务器上挂起的所有 .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/