2

我有一个 的函数myFunctionFunction<Integer, T>我想构造一个mylist大小为 的对象size,实现List<T>(或者可能是某种不可变的列表接口),由该函数支持,从某种意义上说mylist.get(i) == myFunction.apply(i)

我可以手动执行此操作,但是是否有一些(番石榴)代码可以做到这一点?

4

2 回答 2

5

只需使用java.util.AbstractList

 new AbstractList<T>() {
   public T get(int i) {
     Preconditions.checkElementIndex(i, size);
     return function.apply(i);
   }
   public int size() {
     return size;
   }
 }

结果不一定是不可变的,因为函数输出可能会有所不同。很可能,您可以完全摆脱,而只需在您的实现Function中编写 的实现。FunctionAbstractList

于 2013-02-26T21:22:13.163 回答
1

也许您应该考虑使用Iterator<T>.

// Example simple Function that returns each element from the array.
static class Function<T> {
    final T[] t;
    Function(T[] t) {
        this.t = t;
    }
    T apply (Integer i) {
        return t[i];
    }
}

static class FunctionIterator<T> implements Iterator<T> {
    final Function<T> f;
    Integer i;
    Integer to;
    Integer step;

    FunctionIterator(Function<T> f, Integer from, Integer to) {
        this.f = f;
        if ( to > from ) {
            step = 1;
            i = from;
            this.to = to;
        } else {
            step = -1;
            i = to;
            this.to = from;
        }
    }

    @Override
    public boolean hasNext() {
        return i != to + step;
    }

    @Override
    public T next() {
        T next = f.apply(i);
        i += step;
        return next;
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException("Not supported.");
    }
}

此代码提供了一个Iterator. 你可以Iterable很容易地从中做出来。是一个很好的例子,说明如何做到这一点。

于 2013-02-26T21:12:27.203 回答