重构使用流API的方法

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)

由于实际上不需要遍历键集然后从地图中获取价值,因此也不是更好的性能选择。