2013-02-26 75 views
2

我有一个函数的Function<Integer, T>myFunction,我想构建体大小为size的对象mylist,实施List<T>(或者某种不可变列表界面),通过功能的支持,在这个意义上,mylist.get(i) == myFunction.apply(i)如何生成由函数支持的列表?

我可以手动做到这一点,但是有一些(番石榴)代码是否也这样做?

回答

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,并且只需在AbstractList实现中写入Function的实现。

+0

“尺寸”来自哪里? – 2013-02-26 21:57:01

+0

无论你想从哪里来。没有一个没有大小的列表就没有这样的东西,所以可能是OP的大小来自其他地方。 – 2013-02-26 22:03:32

+0

@LouisWasserman:是啊... – einpoklum 2013-02-26 22:16:16

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。你可以很容易地从它做出IterableHere是如何做到这一点的绝佳例子。

+0

@Downvoter - 请有礼貌陈述你的理由! – OldCurmudgeon 2013-02-26 23:05:59

相关问题