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())