2015-01-24 5 views
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()); 

답변

2

이미 매우 간단 보인다.
reversed()와 함께 comparison() (자연 순서)을 사용하여 내림차순으로 정렬 할 수 있습니다.

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

아 사용 예 비교가 더 간결합니다! 보조 노트로 getSize 호출이 필요하지 않으므로 맵에 이미 값이 Long으로 포함되어 있습니다. OP가 업데이트됩니다. – coder

+1

당신이 옳았는데, 내가 어떻게 그것을 놓쳤는 지 확신 할 수 없습니다. 그것은 또한 기능을 불필요하게 만든다. 결정된. – Prometheus

+0

지도를 스트리밍 할 때 비효율적이므로 각 요소를 찾아 보는 것이 좋습니다. dirToSize.entrySet(). stream() .sorted (Collections.reverseOrder (Map.Entry.comparingByValue()) .limit (10) .map (Map.Entry). :: getKey) . 콜렉트 (toList())' – Holger

관련 문제