Преобразование из одного ко многим с гуавой - PullRequest
4 голосов
/ 08 декабря 2011

У меня есть ситуация, когда я хочу извлечь несколько значений из нескольких исходных объектов в коллекцию. Я попытался добиться этого с помощью преобразования Guava, но столкнулся с проблемой, что я получаю коллекцию коллекций, которую мне нужно «сплющить» вручную. Есть ли хороший способ вернуть результаты прямо в плоскую коллекцию?

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

Ответы [ 2 ]

8 голосов
/ 08 декабря 2011

Вы можете использовать Iterables.concat(Iterable<E>... coll) в Guava для группировки нескольких повторяемых результатов

1 голос
/ 08 декабря 2011

То, что вы спрашиваете, это метод reduce / fold.В настоящее время Guava не поддерживает его, хотя существует открытая проблема: http://code.google.com/p/guava-libraries/issues/detail?id=218

Возможно, лучше не использовать Function, а выполнить итерацию и добавить в одну коллекцию.Гуава - это отличный фреймворк, но он не может делать все.

...