AssetType という列挙値を持つオブジェクトのリストがあります。retainAll() メソッドを使用してリストをソートし、AssetType.BANK_ACCOUNT を持つオブジェクトのみを保持することはできますか?
助けが必要な場合は、事前に Thx.
を取り込むと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;
}
}
(開示:私は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();
}
}