1

AssetType という列挙値を持つオブジェクトのリストがあります。retainAll() メソッドを使用してリストをソートし、AssetType.BANK_ACCOUNT を持つオブジェクトのみを保持することはできますか?

助けが必要な場合は、事前に Thx.

4

2 に答える 2

1

を取り込むとGuava、オブジェクトとその の間でライブ トランスフォームを作成し、AssetTypeそれを呼び出すことができますretainAll

Lists.transform(allAssets, assetTypeFn).retainAll(
   Collections.singleton(AssetType.BANK_ACCOUNT));


//...elsewhere...


public static final Function<MyObject, AssetType> assetTypeFn = 
  new Function<MyObject, AssetType>() {
     public AssetType apply(MyObject object) {
         return object.getAssetType();
     }
  };

同様にfilter()、元のリストを変更したくない場合は、次のメソッドを使用できます。

List<MyObject> bankAccounts = Lists.newArrayList(
    Iterables.filter(allAssets, isBankAccount));


public static final Predicate<MyObject> isBankAccount = new Predicate<MyObject>() {
    public boolean apply(MyObject asset) {
        return asset.getAssetType() == AssetType.BANK_ACCOUNT;
    }
}
于 2012-09-09T07:36:59.987 に答える
1

(開示:私はGuavaに貢献しています。)

やや直感的な Guava ベースの実装は次のようになります。

Iterables.removeIf(allAssets, new Predicate<MyObject>() {
  public boolean apply(MyObject asset) {
    return asset.getAssetType() != AssetType.BANK_ACCOUNT;
  }
});

...とはいえ、正直なところ、私は愚かでプレーンな Java 実装を好みます。

Iterator<MyObject> itr = allAssets.iterator();
while (itr.hasNext()) {
  if (itr.next().getAssetType() != AssetType.BANK_ACCOUNT) {
    itr.remove();
  }
}
于 2012-09-09T13:50:31.147 に答える