gpt4 book ai didi

java - Java扩展ArrayList时如何添加map和filter?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:41:22 25 4
gpt4 key购买 nike

我正在尝试创建一个扩展 ArrayListtable 类。在其中,我希望能够创建一个 map 方法,该方法采用 lambda 表达式并返回一个包含映射值的新 table。我还想用 filter 来做到这一点。我经常使用 map 和过滤器,我不喜欢一遍又一遍地输入整个内容。

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?*/);
}
}

我仍在努力弄清楚泛型。也许有更好的方法。我不知道。我曾尝试复制 ArrayList 的原始代码中的内容,但我尝试的一切似乎都会产生新问题。

最佳答案

一方面,这是完全可能的:

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);
}
}

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

另一方面,最好将列表作为Table字段 而不是扩展它:更喜欢组合而不是继承。您真的希望所有 ArrayList 方法都可用吗?

关于java - Java扩展ArrayList时如何添加map和filter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49340700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com