2012-09-09 53 views
1

我有一个对象的列表,所有对象都有一个名为AssetType的枚举值,是否可以使用retainAll()方法对列表进行排序,以便只保留具有AssetType.BANK_ACCOUNT的对象?爪哇retainAll基于枚举值

Thx提前寻求帮助。

+0

直不乱the-盒子,没有。 'retainAll'检查对象是否相等,而不是任何给定的谓词。不过,Java 8应该引入更强大的集合API。 – oldrinb

回答

1

(披露:我对番石榴贡献)

稍微更直观的基于番石榴的实现将是

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(); 
    } 
} 
+0

感谢路易斯,总是喜欢在番石榴中找到我还没用过的新东西!尽管我不同意,但只要你给“谓语”一个描述性的名字,我通常会更喜欢番石榴。在这种情况下,我会去'Iterables.removeIf(allAssets,not(isBankAccount));''不''是'Predicates.not()'。 –

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; 
    } 
} 
+0

为什么'singletonList' vs'singleton'? – oldrinb

+0

@oldrinb:公平点,它不需要是一个列表。 –