我有一个对象的列表,所有对象都有一个名为AssetType的枚举值,是否可以使用retainAll()方法对列表进行排序,以便只保留具有AssetType.BANK_ACCOUNT的对象?爪哇retainAll基于枚举值
Thx提前寻求帮助。
我有一个对象的列表,所有对象都有一个名为AssetType的枚举值,是否可以使用retainAll()方法对列表进行排序,以便只保留具有AssetType.BANK_ACCOUNT的对象?爪哇retainAll基于枚举值
Thx提前寻求帮助。
(披露:我对番石榴贡献)
稍微更直观的基于番石榴的实现将是
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();
}
}
感谢路易斯,总是喜欢在番石榴中找到我还没用过的新东西!尽管我不同意,但只要你给“谓语”一个描述性的名字,我通常会更喜欢番石榴。在这种情况下,我会去'Iterables.removeIf(allAssets,not(isBankAccount));''不''是'Predicates.not()'。 –
如果您在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;
}
}
为什么'singletonList' vs'singleton'? – oldrinb
@oldrinb:公平点,它不需要是一个列表。 –
直不乱the-盒子,没有。 'retainAll'检查对象是否相等,而不是任何给定的谓词。不过,Java 8应该引入更强大的集合API。 – oldrinb