0
FileCriteria 목록이 있습니다. FileCriteria은 다음과 같습니다스트림 API를 사용하여 가장 큰 디렉토리를 찾습니다.
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가 포함되어 있습니다. 이제 하위 디렉토리를 제외하고 가장 큰 파일 (디렉토리 내의 모든 파일의 크기 합계)을 가진 디렉토리를 찾으십시오.
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());
어떤 방식으로 이것을 단순화 할 수 있습니까? 나는 readability 관점에서 의미한다.
프로 메테우스의 힌트는 다음과 같은 개선에 이르게 :
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());
아 사용 예 비교가 더 간결합니다! 보조 노트로 getSize 호출이 필요하지 않으므로 맵에 이미 값이 Long으로 포함되어 있습니다. OP가 업데이트됩니다. – coder
당신이 옳았는데, 내가 어떻게 그것을 놓쳤는 지 확신 할 수 없습니다. 그것은 또한 기능을 불필요하게 만든다. 결정된. – Prometheus
지도를 스트리밍 할 때 비효율적이므로 각 요소를 찾아 보는 것이 좋습니다. dirToSize.entrySet(). stream() .sorted (Collections.reverseOrder (Map.Entry.comparingByValue()) .limit (10) .map (Map.Entry). :: getKey) . 콜렉트 (toList())' – Holger