2011-11-21 21 views
7

内のオブジェクトのプロパティを収集しは、私はこれを行うことができますC#ではコレクション

Collection<Long> ids = new ArrayList<Long>(things.size()); 
for(Thing x : things) 
    ids.add(x.getId()); 

は今、この種のものに非常に多くのことをしなければならないとJavaでこれを行うもっと一般的な方法があるのだろうかと思います。それを行うメソッドを作成することができましたが、getIdメソッドなどのインターフェイスを追加する必要があります...できません...

+0

私は 'things'はCollectionやArrayから継承しないと仮定します。 –

+1

あなたはそれをなぜ仮定しますか? 'for'を使って' things'をループするので、少なくとも配列か反復可能でなければなりません。 – Svish

+0

@Brett Walker IDのコレクションは必要ではなく、別のコレクションではありません。 – NimChimpsky

答えて

2

public class ThingFunction implements Function<Thing, Long> { 
    @Override 
    public Long apply(Thing thing) { 
     return user.getId(); 
    } 
} 

をし、このように呼び出された(変換グアバのCollections2から静的インポートです。

Collection<Long> ids = transform(things, new ThingFunction()); 

グアバもother benefitsかなりの数を持ってい

0

Groovyでこれを行うだけです:リストとしてThingsですべてのものから、あなたにすべてのIdsを与えるだろう

Set ids = things.collect{ aThing -> aThing.Id} 

。ここで

は、いくつかのinfo on Groovy、およびいくつかのdifferences compared to Java

0

あなたがこの方法を試すことができます。それはコレクション、メソッド(リフレクションAPIから)とターゲットクラスを取ります。コレクションのすべてのメンバーのメソッドを呼び出し、結果のリストを返します。

public <T> Collection<T> select(Collection<? extends Object> input, Method getter, Class<T> targetClazz) { 
    ArrayList<T> result = new ArrayList<T>(); 
    for (Object object : input) { 
     try { 
      Object resultObject = getter.invoke(object, (Object[]) null); 
      if (targetClazz.isAssignableFrom(resultObject.getClass())) { 
       result.add(targetClazz.cast(resultObject)); 
      } 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } 
    } 
    return result; 
} 

ここでは、適切なエラー処理を無視しました。使用法:

try { 

    Method getId = Thing.class.getMethod("getId", null); 
    Collection<Long> result = select(things, getId, Long.class); 

} catch (SecurityException e) { 
    e.printStackTrace(); 
} catch (NoSuchMethodException e) { 
    e.printStackTrace(); 
} 
0

実際には答えはありませんが、ラムダ式をサポートするJava 8を待つことができます。それ以外の私はグアバがあなたの最高の選択肢だと思う。 Guava、特にfunction interfaceを使用して

+0

Javaの速度では、それは数十年かかるでしょうか? :p – Svish

+0

2012年10月の予定ですので、角のすぐ後ろです); – soulcheck

+0

しかし、それは私がそれを使用することができるという意味ではありません。まだ1.6の組織で私は現在作業中です... – Svish

1

使用方法Apache Commons 'BeanUtils and Collections:

Collection<Long> ids = CollectionUtils.collect(things, 
     new BeanToPropertyValueTransformer("id"));