【问题标题】:How can I generate a List backed by a Function?如何生成由函数支持的列表?
【发布时间】:2013-02-12 12:08:24
【问题描述】:

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

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

【问题讨论】:

    标签: java list functional-programming guava


    【解决方案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 是一个很好的例子。

    【讨论】:

      【解决方案2】:

      只需使用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 的实现即可。

      【讨论】:

      • size 来自哪里?
      • 无论您希望它来自何处。没有没有大小的列表这样的东西,所以大概 OP 有一个来自其他地方的大小。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多