Java 使用流api查找最大目录

Java 使用流api查找最大目录,java,java-8,Java,Java 8,我有一个文件标准列表。文件标准为: 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 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());
列出文件标准=。。。
Map dirToSize=fileCriterias.stream()
.collect(groupingBy(FileCriteria::getParentPath,summingLong(FileCriteria::getSize));
List largestDirs=dirToSize.keySet().stream()
.sorted((p1,p2)->Long.compare(dirToSize.get(p1),dirToSize.get(p2)))
.限额(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());
Map dirToSize=fileCriterias.stream()
.collect(groupingBy(FileCriteria::getParentPath,summingLong(FileCriteria::getSize));
List largestDirs=dirToSize.keySet().stream()
.sorted(比较(dirToSize::get).reversed())
.限额(10)
.collect(toList());

看起来已经相当简单了。
可以使用comparing()(自然顺序)和reversed()按降序排序

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

ah yes使用比较更简洁!作为补充说明,不需要getSize调用,因为映射已经包含了相同长度的值。OP更新了…你是对的,不知道我怎么错过了。这也使得该功能变得不必要。修正了。当在地图上进行流传输时,不鼓励对每个元素执行查找,因为这样效率很低。只需在元素上而不是键上进行流式处理:
dirToSize.entrySet().stream().sorted(Collections.reverseOrder(Map.Entry.comparingByValue()).limit(10).Map(Map.Entry::getKey).collect(toList())