2011-12-08 3 views
4

여러 원본 개체의 여러 값을 컬렉션으로 추출하려는 경우가 있습니다. 구아바의 변형으로이 작업을 수행하려고했지만 문제가 발생하여 수동으로 '플랫 화'해야하는 콜렉션 모음을 되 찾을 수 있습니다. 플랫 컬렉션에서 직접 결과를 다시 얻을 수있는 좋은 방법이 있습니까?구아바에서 1 대 다수로 변환

private static final Function<Target, Collection<Integer>> EXTRACT_FUNCTION = new Function<SourceObject, Collection<Integer>>() { 
    @Override 
    public Collection<Integer> apply(SourceObject o) { 
     // extract and return a collection of integers from o 
     return Lists.newArrayList(..); 
    } 
}; 

Collection<SourceObject> sourceObjects = ... 
Collection<Collection<Integer>>> nestedResults = transform(sourceObjects, EXTRACT_FUNCTION); 

// Now I have to manually flatten the results by looping and doing addAll over the nestedResults.. 
// Can this be avoided? 
Collection<Integer> results = flattenNestedResults(nestedResults); 

답변

8

당신은 구아바의 Iterables.concat(Iterable<E>... coll) 그룹에 몇 가지 반복 가능한 결과

+0

올바른 내용입니다. Iterables.concat은 flattenNestedResults 함수를 대체합니다. –

1

를 사용하여 무엇을 요구하는 것은 reduce/fold 방법입니다 수 있습니다. http://code.google.com/p/guava-libraries/issues/detail?id=218

은 아마 당신이 Function를 사용하지만, 그것을 반복하고 하나 개의 컬렉션에 추가하지 않는 더 나은 아이디어 : 개방 문제가 있지만 현재 Guava가이를 지원하지 않습니다. 구아바는 훌륭한 틀이지만 모든 것을 할 수는 없습니다.

+0

'Iterables.concat (Iterable ... coll)'을 알지 못했지만, 결과가'Collection' 대신'Iterable'이 될지 모른다면 이것을 사용할 수 있습니다 – wyz

+0

그리고 또 다른 비슷한 문제가 있습니다 : http :// /code.google.com/p/guava-libraries/issues/detail?id=546 –

+2

정말 컬렉션이 필요한 경우 일반적으로'Iterables.concat()'을'Lists.newArrayList()와 같은 복사 메소드와 결합 할 수 있습니다.)','ImmutableList.copyOf()','Sets.newHashSet()'또는'ImmutableSet.copyOf()'입니다. 반복 가능한 뷰를 반환하는 것은 임의로 선택하는 대신 결과 집합 유형을 선택할 수 있으므로 매우 영리합니다. 또한 실제 컬렉션이 필요하지 않은 경우 요소 복사를 방지합니다. –