gpt4 book ai didi

java - 重构使用流 API 的方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:30:15 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com