当我在Java中扩展ArrayList时,如何添加地图和过滤器?

Mak*_*kPo 8 java generics extends arraylist java-8

我正在尝试创建一个table扩展的类ArrayList.在其中,我希望能够创建一个map采用lambda表达式并返回table带有映射值的new 的方法.我也想这样做filter.我使用地图和过滤很多,我不喜欢一遍又一遍地输入整个东西.

public abstract class Table<E extends Element> extends ArrayList<E> {
    // a lot of other stuff.

    public Table<E> map(/*WHAT DO I PUT HERE?*/ mapper) {
        return this.stream().map(mapper).collect(/*WHAT DO I PUT HERE?*/);
    }

    public Table<E> filter(/*WHAT DO I PUT HERE?*/ predicate) {
        return this.stream().filter(predicate).collect(/*WHAT DO I PUT HERE?*/);
    }
}
Run Code Online (Sandbox Code Playgroud)

我仍在试图找出泛型.也许有更好的方法.我不知道.我曾尝试复制原始代码中的内容ArrayList,但我尝试的所有内容似乎都会产生新的问题.

Ale*_*nov 8

一方面,它完全有可能:

public abstract class Table<E extends Element> extends ArrayList<E> {
    // implement in concrete subclasses
    public abstract <E1 extends Element> Collector<E1, ?, Table<E1>> collector();
    // Collector<E, ?, Table<E>> collector() is enough if map doesn't have E1 type parameter

    public <E1 extends Element> Table<E1> map(Function<E, E1> mapper) {
        return this.stream().map(mapper).collect(collector());
    }

    public Table<E> filter(Predicate<E> predicate) {
        return this.stream().filter(predicate).collect(collector());
    }
}

public class ChildTable<E extends Element> extends Table<E> {
    @Override
    public <E1 extends Element> Collector<E1, ?, Table<E1>> collector() {
        return Collectors.toCollection(() -> new ChildTable<E1>());
        // or simpler Collectors.toCollection(ChildTable::new);
    }
}
Run Code Online (Sandbox Code Playgroud)

collector()可以实现,但它必须返回一个特定的子类型Table.

另一方面,它可能是更好有列表作为现场Table,而不是扩展它:喜欢在组成继承.你真的想要所有ArrayList方法吗?

  • 由于只有供应商不同,只有声明`abstract <E1> Supplier <Table <E1 >> tableSupplier()`方法而不是`collector()`才能由子类实现,因此设计会更简单. (2认同)