0

FunctionsのようなグアバがありFunction<String,Set<String>>ます。それらを使用すると にFluentIterable.transform()つながりますがFluentIterable<Set<String>>、 が必要FluentIterable<String>です。したがって、私の考えは、サブクラスFluentIterable<E>化して新しいメソッドを追加し、transform2()それを返す前にすべてを 1 つのコレクションに単純にマージすることです。

元の変換メソッドは次のようになります。

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

現在、新しいサブクラスには 2 つの問題がPROBLEM 1あります。PROBLEM 2

  • 問題 1: 元の FluentIterable クラスの iterable フィールドはプライベートです。これについて何ができますか? サブクラスに同じ名前の新しいプライベート フィールドを作成できますか? このフィールドを使用する super.someMethod() を呼び出すサブクラスのメソッドはどうですか? その後、おそらく異なる値を持つスーパークラスのフィールドを使用するでしょうか?

  • 問題 2: 複数のコレクションのコンテンツを結合できるジェネリック コレクションが必要ですが、コレクションはインターフェイスであるため、インスタンス化できません。それで、そこでどのクラスを使用できますか?

ソリューションがセットでのみ機能する場合は許容されますが、セットとリストで機能するソリューションが望ましいです。

これに関するヒントをありがとう!

4

3 に答える 3

3

これを行うためだけに FluentIterable をサブクラス化するのはなぜですか? シンプルなループが必要です:

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