使用stream api查找最大的目录

时间:2015-01-24 01:57:16

标签: java java-8

我有一个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());

1 个答案:

答案 0 :(得分:2)

看起来很简单。
您可以使用comparison()(自然顺序)和reversed()来按降序排序。

List<Path> largestDirs = dirToSize.keySet().stream()
    .sorted(comparing(dirToSize::get).reversed())
    .limit(10)
    .collect(toList());