0

我有一些番石榴之Functions类的Function<String,Set<String>>。使用那些FluentIterable.transform()会导致 a FluentIterable<Set<String>>,但是我需要 a FluentIterable<String>。所以我现在的想法是子类化FluentIterable<E>并添加一个新方法transform2(),在返回之前简单地将所有内容合并到一个集合中。

原来的变换方法是这样的:

public final <T> FluentIterable<T> transform(Function<? super E, T> function) {
  return from(Iterables.transform(iterable, function));
}

我为我的子类和transform2()方法想到了这样的东西:

public abstract class FluentIterable2<E> extends FluentIterable<E> 
{       
    public final <T> FluentIterable<T> transform2(Function<? super E, Collection<T>> function) {
        // (PROBLEM 1) Eclipse complains: The field FluentIterable<E>.iterable is not visible  
        Iterable<Collection<T>> iterables = Iterables.transform(iterable, function);

        // (PROBLEM 2) Collection<T> merged = new Collection<T>(); // I need a container / collection - which one?
        for(Collection<T> iterable : iterables)
        {
            // merged.addAll(iterable);
        }

        // return from(merged);
    }
}

目前我的新子类有两个问题,上面标有PROBLEM 1PROBLEM 2

  • 问题 1:原始 FluentIterable 类中的可迭代字段是私有的 - 我该怎么办?我可以在我的子类中创建一个具有相同名称的新私有字段,这样可以吗?我的子类中调用 super.someMethod() 并使用该字段的方法呢?然后他们会使用超类的字段,它可能具有不同的值吗?

  • 问题2:我需要一些通用的集合,我可以组合几个集合的内容,但是集合是一个接口,所以我不能实例化它。那么,我可以在那里使用哪个类?

如果解决方案仅适用于集合,那将是可以接受的,但我更喜欢适用于集合和列表的解决方案。

感谢您对此的任何提示!

4

3 回答 3

6

FluentIterable.transformAndConcat(stringToSetFunction)不适用于您的用例?

于 2013-04-05T21:08:47.960 回答
3

为什么子类 FluentIterable 只是为了做到这一点?你只需要一个简单的循环:

Set<String> union = Sets.newHashSet();
for (Set<String> set : fluentIterableOfSets) {
    union.addAll(set);
}
于 2013-04-05T20:45:34.670 回答
3

使用FluentIterable.transformAndConcat(f),其中f是一个将元素映射到元素类型上的某种可迭代的函数。

在你的情况下,假设你Function<String, Set<String>>的名字叫做 TOKENIZE,你Iterable<String>的名字叫做 LINES。

然后要获得Set<String>LINES 中所有不同的标记,请执行以下操作:

Iterable<String> LINES = ...;
Function<String, Set<String>> TOKENIZE = ...;
Set<String> TOKENS = FluentIterable.from(LINES)
    .transformAndConcat(TOKENIZE)
    .toSet();

但请仔细考虑 JB Nizet 的回答。尝试两种方式,看看哪种效果更好。

于 2013-04-05T21:14:59.623 回答