2016-07-11 1 views
1

Guava静的Collections2.transformメソッドとLists.transformメソッドを使用してjooq Recordクラスに基づいてArrayListを作成しようとしています。以下は、result3レコードを生成しているクエリです。Static Lists.transformはエラーとしてマークされていますが、同じ変数を使用するCollections.transformが機能します

final Table<Record3<Key<Store>, Key<Campaign>, String>> c1 = sql.dsl() 
      .select(CAMPAIGN.STORE_KEY, CAMPAIGN.CAMPAIGN_KEY, tag) 
      .from(CAMPAIGN) 
      .where(CAMPAIGN.CAMPAIGN_KEY.equal(campaignKey)) 
      .asTable("c1"); 

    final Table<Record3<Key<Store>, Key<Campaign>, String>> c2 = sql.dsl() 
      .select(CAMPAIGN.STORE_KEY, CAMPAIGN.CAMPAIGN_KEY, tag) 
      .from(CAMPAIGN) 
      .asTable("c2"); 

    final Result<Record2<Key, Integer>> result3 = sql.dsl() 
      .select(c1Campaign, count(c2Tag)) 
      .from(c1, c2) 
      .where(c1.field("tag", String.class).equal(c2.field("tag", String.class))) 
      .and(c1.field("store_key", Key.class).equal(c2.field("store_key", Key.class))) 
      .and(c1.field("campaign_key", Key.class).notEqual(c2.field("campaign_key", Key.class))) 
      .groupBy(c2.field("campaign_key", Key.class)) 
      .orderBy(inline(2).desc()) 
      .fetch(); 

は、以前私は私が作成されたコレクションオブジェクトによってサポートされていない、後でコレクションに値を追加する必要が実現するまで正常に動作して、次のコードを持っていました。そのため、この問題の

final Collection<Key<Campaign>> keys = Collections2.transform(result3, Record2::value1); 

私はArrayListの作成に切り替えることを試みたが、私が追加したときに、次は私が「非静的メソッドがstaticコンテキストから参照することはできません」というエラーが出る

final ArrayList<Key<Campaign>> keys2 = Lists.transform(result3, Record2::value1); 

混乱させることは、両方の変換メソッドが静的であり、それらはまったく同じオブジェクト上で動作しているので、なぜ最初のものが動作し、他のものは動作しないのでしょうか?また、2番目のメソッドがうまくいかない場合、この方法でArrayListの生成をどのように行うことができますか?

答えて

0

コンパイルで見た2番目のエラーがあることがわかりました。その答えに私は指摘しました。代わりにLists.transformからのArrayListを作成する私はそれをリストに変更し、それはあなたが実際に質問を扱う前に、Javaとグアバについて知っておく必要が正しく

0

カップルの基本的な事柄コンパイル:Javaでは

  1. を、 List<Key>ArrayList<Key>ではありませんが(逆の場合は真です) - ArrayListは、の(多くの可能性のある)実装です。
  2. ListArrayListに割り当てることはできません(少なくともキャストは必要ありませんが、解決方法もオプションもありません)。
  3. ArrayListを作成しても、コードで具体的な実装を使用するのではなく、インターフェイス(ここではList)に固執するのがベストプラクティスではありません。
  4. グァバのCollections2.transformLists.transformリターン怠惰なビュービュー(from javadoc、強調鉱山)を作成するために使用されるコレクションの

    は、返されたリストは、fromListの変換された図です。 fromListの変更は返されたリストに反映され、その逆もあります。 (...)

    機能は遅れて適用され、必要に応じて呼び出されます。返されるリストがビューである必要がありますが、List.contains(java.lang.Object)やList.hashCode()などのバルク操作では、この関数が何度も適用されることになります。これがうまくいくためには、関数は速くなければなりません。返されたリストがビューである必要がないときに遅延評価を避けるには、返されたリストを新しいリストにコピーします。いくつかのコレクション/リストにコピーまたは消費されるまでは何も評価しませんあなたのケースで述べたことすべて、keysを持つ

、とても有効な方法は、次のようになります。

final Collection<Key<Campaign>> keys = Collections2.transform(result3, Record2::value1); 
// later: 
final List<Key<Campaign>> keys2 = new ArrayList<>(keys); // here the function is applied 

または

final List<Key<Campaign>> keys2 = new ArrayList<>(Lists.transform(result3, Record2::value1)); 

私が気になるのは、すでにJava 8を使用していることを示すメソッド参照(Record2::value1)を使用することです.yしてください、使用してくださいStreams API

List<Key<Campaign>> keys = result3.stream() 
    .map(Record2::value1) 
    .collect(Collectors.toList()); 
関連する問題