使用流 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());