首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实现map功能

实现map功能
EN

Stack Overflow用户
提问于 2019-11-06 09:47:54
回答 1查看 92关注 0票数 2

我正在创建一个'SpecialList‘,我需要实现地图功能。该列表应该是惰性的,并且仅在计算时才会产生值。

toString()返回"?“如果值尚不可用,则返回值的字符串表示形式,否则返回值的字符串表示形式。

在需要内容时调用get()。如果该值已经可用,则返回该值;否则,计算该值并返回它。对于相同的值,计算应该只进行一次。

这就是我所拥有的:

代码语言:javascript
运行
复制
public <U> SpecialList<U> map(Function<T, U> mapper) {
    if (!this.isAvailable) {
        return new SpecialList<U>(this.supplier);
    }
    return new SpecialList<U>(mapper, value);
}

// private constructor
private SpecialList(CachedSupplier<T> s) {
    this.supplier = s;
    this.isAvailable = false;
}

然而,它告诉我没有有效的构造器,因为T不能转换为U。

代码语言:javascript
运行
复制
SpecialList.java:65: error: no suitable constructor found for SpecialList(SpecialList<T>.CachedSupplier<T>)
            return new SpecialList<U>(this.supplier);
                   ^
    constructor SpecialList.SpecialList(U) is not applicable
      (argument mismatch; SpecialList<T>.CachedSupplier<T> cannot be converted to U)
    constructor SpecialList.SpecialList(Supplier<U>) is not applicable
      (argument mismatch; SpecialList<T>.CachedSupplier<T> cannot be converted to Supplier<U>)

返回时,“U”不会变成T吗?

我该如何着手解决这个问题?关于方法级别的泛型类型,我仍然不太清楚。但是我被告知需要为我的map方法添加

下面是我的完整代码:

代码语言:javascript
运行
复制
class SpecialList<T> {
    class CachedSupplier<T> {
        private Supplier<? extends T> supplier;
        private T value;
        boolean isAvailable;

        public CachedSupplier(Supplier<? extends T> supplier) {
            this.supplier = supplier;
        }

        public T get() {
            if (!isAvailable) {
                value = supplier.get();
                isAvailable = true;
            }
            return value;
        }
    }

    private CachedSupplier<T> supplier;
    private T value;
    boolean isAvailable;

    private SpecialList(T value) {
        this.value = value;
        this.isAvailable = true;
    }

    private SpecialList(Supplier<T> s) {
        this.supplier = new CachedSupplier<T>(s);
        this.isAvailable = false;
    }

    private SpecialList(CachedSupplier<T> s) {
        this.supplier = s;
        this.isAvailable = false;
    }

    private <R> SpecialList(Function<T, R> mapper, T v) {
        this.supplier = new CachedSupplier<T>(() -> mapper.apply(v));
        this.isAvailable = false;
    }

    public static <T> SpecialList<T> of(T value) {
        return new SpecialList<>(value);
    }

    public static <T> SpecialList<T> of(Supplier<T> supplier) {
        return new SpecialList<>(supplier);
    }

    public <R> SpecialList<R> map(Function<? super T,? extends R> mapper) {
        if (!this.isAvailable) {
            return new SpecialList<>(this.supplier);
        }
        return new SpecialList<R>(mapper, value);
    }

    public T get() {
        if(this.isAvailable) {
            return this.value;
        } else {
            this.value = this.supplier.get();
            this.isAvailable = true;
            return this.value;
        }
    }
}

我仍然对泛型类型等有点困惑,所以如果有什么奇怪的地方,请告诉我/我可以改进!

谢谢

EN

回答 1

Stack Overflow用户

发布于 2019-11-06 10:38:42

根据您发布的代码,在类SpecialList的一个构造函数中存在编译时错误...

代码语言:javascript
运行
复制
private <R> SpecialList(Function<T, R> mapper, T v) {
    this.supplier = new CachedSupplier<T>(() -> mapper.apply(v));
    this.isAvailable = false;
}

首先,在您发布的代码中,内部类CachedSupplier中没有接受Function参数的构造函数,因此需要添加一个带有此签名的构造函数:

代码语言:javascript
运行
复制
public <R> CachedSupplier(Function<T, R> mapper)

SpecialList构造函数的第二个问题是λ表达式。接口Function中的抽象方法apply有一个参数,而您的lambda表达式缺少该参数。所以构造函数代码应该是:

代码语言:javascript
运行
复制
private <R> SpecialList(Function<T, R> mapper, T v) {
    this.supplier = new CachedSupplier<T>((v) -> mapper.apply(v));
    this.isAvailable = false;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58721937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档