用Java中的方法将Collections的集合合并到Collection中

时间:2019-02-16 12:59:18

标签: java arraylist

我创建了一个Collection类,该类扩展了ArrayList以添加一些有用的方法。看起来像这样:

public class Collection<T> extends ArrayList<T> {
    //some methods...
}

我希望能够将一个Collections集合为一个Collection,就像这样:

{{1, 2}, {2,3}, {1}, {2}, {}} -> {1, 2, 2, 3, 1, 2}

我对静态方法的外观有所了解:

public static<E> Collection<E> unite(Collection<Collection<E>> arr) {
    Collection<E> newCollection = new Collection<>();

    for(Collection<E> element : arr) {
        newCollection.merge(element);
    }

    return newCollection;
}

但是我不知道如何使该方法变为非静态(这样它就不接受任何参数,例如:

Collection<E> list = listOfLists.unite();

)。那有可能吗?如果是,您能帮我吗?

3 个答案:

答案 0 :(得分:1)

对于任何具体类型T这样做都是没有意义的。如果T不是Collection类型的,则unite()是不相关的方法(例如,如果您有ArrayListModified<Double>,则不能将其展平,因为这很荒谬)。

因此,您必须使T绑定到集合:

public class ArrayListModified<E, T extends Collection<E>> extends ArrayList<T> {

    public Collection<E> unite() {
        Collection<E> newCollection = new ArrayList<>();

        for (Collection<E> element : this) {
            newCollection.addAll(element);
        }

        return newCollection;
    }
}

或者使用与当前实现中一样采用一个ArrayListModified<ArrayListModified<E>>参数的静态方法(尽管不需要是静态的)。

答案 1 :(得分:0)

一种方法是将类型参数明确声明为List<E>,然后将其直接声明为

class NestedList<E> extends ArrayList<List<E>> {
    public List<E> flatten() {
        return stream()
            .flatMap(Collection::stream)
            .collect(Collectors.toList());
    }
}

答案 2 :(得分:-1)

尝试使用'?'而不是“ E”。知道我是否正确。

cart