将原始集合转换为通用集合的就绪解决方案

时间:2018-07-18 09:17:15

标签: java apache collections guava apache-commons

我想知道是否有现成的解决方案将原始集合(列表,集合等)转换为通用集合(列表,集合等)。我为此写了自己的自行车:

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之外寻找现成的解决方案。

2 个答案:

答案 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());
}

这有助于立即表明您的方法正在对兼容对象进行过滤。