2011-09-16 3 views
7

Guavaを使用してコレクション、マップなどに関数を適用したいとします。Java Guavaを使用してコレクションに関数を適用することはできますか?

基本的に、私はこのような何かやって、別途ので、すべての行と列が同じ大きさでありTableの行と列のサイズを変更する必要があります:私はすでに何ResizeFunctionのアイデアを持っている

Table<Integer, Integer, Cell> table = HashBasedTable.create(); 
    Maps.transformValues(table.columnMap(), new ResizeFunction(BlockDimension.WIDTH)); 
    Maps.transformValues(table.rowMap(), new ResizeFunction(BlockDimension.HEIGHT)); 

public interface Cell { 
    int getSize(BlockDimension dimension); 
    void setSize(BlockDimension dimension); 
} 

をすべきですさあ。しかし、私はを適用する必要があるだけでなく、Collectionを返します。グアバで

答えて

13

、既存のリストを変換し、代わりにIterables.transformを使用して新しいものを作成しないでください:

final List<String> list = Arrays.asList("race", "box"); 
final List<String> transformed = 
    Lists.newArrayList(Iterables.transform(list, new Function<String, String>() { 

     @Override 
     public String apply(final String input) { 
      return new StringBuilder().append(input).append("car").toString(); 
     } 
    })); 
System.out.println(transformed); 

出力:

[レースカー、ボックスカー]

ListCollectionが必要ない場合は、変換ライブビューを使用できます。

final Collection<String> transformed = 
    Collections2.transform(list, new Function<String, String>() { 

     @Override 
     public String apply(final String input) { 
      return new StringBuilder().append(input).append("car").toString(); 
     } 
    }); 

このCollectionは、基礎となる1のライブビューなので、listへの変更は、このCollectionに反映されます。

public static <T> void apply(Iterable<T> iterable, Function<T, Void> function) { 
    for (T input : iterable) 
     function.apply(input); 
} 
+0

申し訳ありません申し訳ありませんが、問題の性質についてはわかりませんでした(上記参照)。ご覧のとおり、行+列コレクションに関数を適用する必要があり、それらを返すことには興味がありません。 –

+0

Guavaはコレクションにすぐに適用されるapply()関数を持たなければならないと私はまだ主張していますが、これは正しいので、私は受け入れました。 –

3

。次のようなものがあります。

for (int i=0; i<numRows; i++) 
    for (int j=0; j<numColumns; j++) 
     table.put(i,j,null); 

これは、テーブルの各位置にセルがあることを保証します。 numRows、numColumns内にある行、列の位置にセルを追加するだけで、「正方形」の表が維持されます。

+0

私は 'applyToEach'メソッドに名前をつけます。そして、 'Function 'をパラメータ型として使うことができます。これは、あなたが興味のない戻り値を持つ関数を使うことを可能にします。 –

0

私は人口が適切なサイズであることを前だろうが、テーブルを設定したほうが良いと思います/彼らは空になっている場合でも、適切な数の細胞を持っています。このような関数を作成する方法については何

1

Seanは既にGuavaが元のコレクションを変更しないので、既存のコレクションに実際に関数を適用することはできません。あなただけTable<Integer, Integer, Cell>Cellの値を変更する場合

は、それはあなたのResizeFunction機能が何をするかは明らかではありません、あなたはTables#transformValues()

グァバを使用することができます(あなたがTable<R, C, V>RCの値を変更することはできません。 (Tablesクラスでは)行や列のマップ(Table#rowMap()Table#columnMap())を返すときにこれらのキーがキーとして使用され、Guavaのすべての変換とフィルタリングのメソッドが遅延結果を生成するため、変換できません。オブジェクトが使用されます。彼らはコピーを作成しません。そのため、変換はSetの要件を簡単に破る可能性があります。

あなたがまだそれをしたい場合は、自分のクラスにTableオブジェクトをラップし、必要な方法を提供することができます。

関連する問題