我有一个函数的Function<Integer, T>
myFunction
,我想构建体大小为size
的对象mylist
,实施List<T>
(或者某种不可变列表界面),通过功能的支持,在这个意义上,mylist.get(i) == myFunction.apply(i)
。如何生成由函数支持的列表?
我可以手动做到这一点,但是有一些(番石榴)代码是否也这样做?
我有一个函数的Function<Integer, T>
myFunction
,我想构建体大小为size
的对象mylist
,实施List<T>
(或者某种不可变列表界面),通过功能的支持,在这个意义上,mylist.get(i) == myFunction.apply(i)
。如何生成由函数支持的列表?
我可以手动做到这一点,但是有一些(番石榴)代码是否也这样做?
只需使用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
的实现。
也许而不是一个列表,你应该考虑一个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
。 Here是如何做到这一点的绝佳例子。
@Downvoter - 请有礼貌陈述你的理由! – OldCurmudgeon 2013-02-26 23:05:59
“尺寸”来自哪里? – 2013-02-26 21:57:01
无论你想从哪里来。没有一个没有大小的列表就没有这样的东西,所以可能是OP的大小来自其他地方。 – 2013-02-26 22:03:32
@LouisWasserman:是啊... – einpoklum 2013-02-26 22:16:16