使用番石榴从一个转变为多个

时间:2011-12-08 08:44:15

标签: java collections transform guava

我有这样的情况,我想从多个源对象中提取多个值到一个集合中。我试图通过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 个答案:

答案 0 :(得分:8)

您可以使用Guava的Iterables.concat(Iterable<E>... coll)对几个可迭代的结果进行分组

答案 1 :(得分:1)

您要问的是reduce / fold方法。尽管有一个未解决的问题,Guava目前仍然不支持Function

也许最好不要使用{{1}},而是迭代它并添加到一个集合中。番石榴是一个很好的框架,但它不能做任何事情。