我有一个FileCriteria列表。 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.
基于My Stream 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());
这可以通过某种方式简化吗?我的意思是从可读性的角度来看。
普罗米修斯的暗示导致了以下改进:
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());
答案 0 :(得分:2)
看起来很简单。
您可以使用comparison()(自然顺序)和reversed()来按降序排序。
List<Path> largestDirs = dirToSize.keySet().stream()
.sorted(comparing(dirToSize::get).reversed())
.limit(10)
.collect(toList());