使用流 api 查找最大的目录
using stream api to find largest directories
我有一个 FileCriteria 列表。文件条件是:
public class FileCriteria {
private final Path path;
private final long size;
public FileCriteria(Path path, long size) {
this.path = path;
this.size = size;
}
public Path getPath() {
return path;
}
public Path getParentPath() {
return path.getParent() == null ? Paths.get("") : path.getParent();
}
public long getSize() {
return size;
}
}
列表包含每个文件和目录的FileCriteria
一个目录,换句话说,一个完整的文件树。
现在我需要找到其中包含最大文件的目录(其中所有文件的大小总和),不包括子目录,它们算作文件大小 0.
我的流 API 基于解决方案是这样的:
List<FileCriteria> fileCriterias = ...
Map<Path, Long> dirToSize = fileCriterias.stream()
.collect(groupingBy(FileCriteria::getParentPath, summingLong(FileCriteria::getSize)));
List<Path> largestDirs = dirToSize.keySet().stream()
.sorted((p1, p2) -> -Long.compare(dirToSize.get(p1), dirToSize.get(p2)))
.limit(10)
.collect(toList());
这可以通过某种方式简化吗?我的意思是从可读性的角度来看。
Prometheus 的提示导致以下改进:
Map<Path, Long> dirToSize = fileCriterias.stream()
.collect(groupingBy(FileCriteria::getParentPath, summingLong(FileCriteria::getSize)));
List<Path> largestDirs = dirToSize.keySet().stream()
.sorted(comparing(dirToSize::get).reversed())
.limit(10)
.collect(toList());
看起来已经很简单了。
您可以将 comparing() (自然顺序)与 reversed() 一起使用以按降序排序。
List<Path> largestDirs = dirToSize.keySet().stream()
.sorted(comparing(dirToSize::get).reversed())
.limit(10)
.collect(toList());
我有一个 FileCriteria 列表。文件条件是:
public class FileCriteria {
private final Path path;
private final long size;
public FileCriteria(Path path, long size) {
this.path = path;
this.size = size;
}
public Path getPath() {
return path;
}
public Path getParentPath() {
return path.getParent() == null ? Paths.get("") : path.getParent();
}
public long getSize() {
return size;
}
}
列表包含每个文件和目录的FileCriteria 一个目录,换句话说,一个完整的文件树。 现在我需要找到其中包含最大文件的目录(其中所有文件的大小总和),不包括子目录,它们算作文件大小 0.
我的流 API 基于解决方案是这样的:
List<FileCriteria> fileCriterias = ...
Map<Path, Long> dirToSize = fileCriterias.stream()
.collect(groupingBy(FileCriteria::getParentPath, summingLong(FileCriteria::getSize)));
List<Path> largestDirs = dirToSize.keySet().stream()
.sorted((p1, p2) -> -Long.compare(dirToSize.get(p1), dirToSize.get(p2)))
.limit(10)
.collect(toList());
这可以通过某种方式简化吗?我的意思是从可读性的角度来看。
Prometheus 的提示导致以下改进:
Map<Path, Long> dirToSize = fileCriterias.stream()
.collect(groupingBy(FileCriteria::getParentPath, summingLong(FileCriteria::getSize)));
List<Path> largestDirs = dirToSize.keySet().stream()
.sorted(comparing(dirToSize::get).reversed())
.limit(10)
.collect(toList());
看起来已经很简单了。
您可以将 comparing() (自然顺序)与 reversed() 一起使用以按降序排序。
List<Path> largestDirs = dirToSize.keySet().stream()
.sorted(comparing(dirToSize::get).reversed())
.limit(10)
.collect(toList());