我想知道是否有现成的解决方案将原始集合(列表,集合等)转换为通用集合(列表,集合等)。我为此写了自己的自行车:
public <T> List<T> filterInstancesOfClass(List list, Class<T> clazz) {
List<T> generifiedList = new ArrayList<T>();
for (Object o : list) {
if (clazz.isInstance(o)) {
generifiedList.add(clazz.cast(o));
}
}
return generifiedList;
}
但是我敢肯定,流行的库中应该有一个可以使用集合(Apache,Guava)的现成解决方案。你认识一个吗?
UPD。不幸的是,我无法使用Java 8,因此我正在JDK之外寻找现成的解决方案。
答案 0 :(得分:3)
如果您要查找的内容很短,可以使用jOOλ的Seq.ofType(),如下所示:
Seq.seq(list).ofType(clazz).toList()
EDIT :好,在JDK 6或JDK 7上,您可以使用Guava 20.0及其Iterables.filter
方法,如下所示:
public <T> List<T> filterInstancesOfClass(List<?> list, Class<T> clazz) {
return Lists.newArrayList(Iterables.filter(list, clazz));
}
如果您不需要变回我的List
,可以将Lists.newArrayList
替换为ImmutableList.copyOf
。
答案 1 :(得分:3)
没有现成的解决方案,但是您可以像这样在一行中做同样的事情:
public <T> List<T> filterInstancesOfClass(List<?> list, Class<T> clazz) {
return list.stream().filter(p -> clazz.isInstance(p)).map(p -> clazz.cast(p)).collect(Collectors.toList());
}
这有助于立即表明您的方法正在对兼容对象进行过滤。