deH*_*aar 8 java sum java-8 java-stream
目前,我被告知要对所有在某些服务器上挂出的.sql文件进行计数。手动解决这个非常基本的任务不是一个选择,相反,我编写了一些代码,该代码利用a SimpleFileVisitor<Path>并将找到的所有sql文件及其父路径存储在a中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;
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是,如何使用流API进行相同操作?
我无法使可编译代码正常工作,这显然没有做错事。不幸的是,
以下几行对我来说似乎是个好主意,但对编译器而言却不是。
totalAmount = sqlFilesInDirectories.entrySet().stream().map(List::size).sum();
Run Code Online (Sandbox Code Playgroud)
编译器说
无法推断以下类型的参数
<R> map(Function<? super T,? extends R>
有谁知道我在做什么错(也许使用解决方案提供了一些受过教育的流API)?
Pus*_*shi 13
keySet当所需的总和仅包含值中的列表大小时,不确定为什么人们会参与其中。只需将所有值的大小相加即可。
return sqlFilesInDirectories.values().stream().mapToInt(List::size).sum();
Run Code Online (Sandbox Code Playgroud)
甚至for循环版本也应该就是这样,
for (List<Path> list : sqlFilesInDirectories.values()) {
totalAmount += list.size();
}
Run Code Online (Sandbox Code Playgroud)
由于实际上不需要遍历键集然后从地图中获取价值,因此也不是更好的性能选择。
| 归档时间: |
|
| 查看次数: |
384 次 |
| 最近记录: |