道歉,如果这已在其他地方得到解答,但我还没有找到一个好的答案!
我有一个Set
个对象需要按其基础class
类型拆分为Set
每个(显然这意味着初始集中的每个对象都只会出现在新Set
个对象的一个中。
我目前的做法如下:
public static Map<Class,Set<Foo>> splitByClass(Set<Foo> foos) {
// Create a map for the result
Map<Class,Set<Foo>> FooMap = new HashMap<Class,Set<Foo>>();
for (Foo foo: foos) {
Class type = foo.getClass();
// If a set for this key exists, add the item to that.
if (FooMap.containsKey(type)) {
FooMap.get(type).add(foo);
} else {
// Otherwise make a new set, add the item and the set to the map.
Set<Foo> set = new HashSet<Foo>();
set.add(foo);
FooMap.put(type, set);
}
}
return FooMap;
}
我的问题:是否有更通用的方法将Set
拆分为子集,基于某些评估方法,例如检查类类型?
答案 0 :(得分:2)
你可以使用番石榴Multimap
,它会让生活变得更简单:
Multimap<Class<? extends Foo>, Foo> mmap = HashMultimap.create();
for (Foo foo : foos) {
mmap.put(foo.getClass(), foo);
}
return mmap;
此代码几乎与您的上述代码相同,只是您必须将返回类型更改为Multimap<Class<? extends Foo>, Foo>
。
这是一个适用于任何提供的接口类型的通用版本:
public static <X> Multimap<Class<X>, X> splitByClass(
final Iterable<? extends X> implementations, final Class<X> interfaceType) {
final Multimap<Class<X>, X> mmap = HashMultimap.create();
for (final X implementation : implementations) {
@SuppressWarnings("unchecked")
// this should be safe:
final Class<X> implementationType = (Class<X>) implementation.getClass();
mmap.put(implementationType, implementation);
}
return mmap;
}