给自定义容器类添加".foreach"功能

3
我为我的游戏编写了自己的容器类,类似于ArrayList,但在许多方面有所不同。无论如何,我想编写一个foreach方法,以迭代后备数组。
我知道可以使用Arrays.stream,但我很好奇如何编写一个自定义lambda实现#foreach方法,用于迭代数组。
有人知道该怎么做吗?谢谢
示例:
class Container<T> {
    T[] array = new T[200]; 
}

现在,例如我想要做这个:

Container<Fish> fishies = new Container();
fishies.forEach(fish->System::out);

1
你无法创建Generic - chengpohi
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/ArrayList.java#ArrayList.forEach%28java.util.function.Consumer%29 - Alexis C.
1
@Chengphoi (T[]) new Object[200]; - Hobbyist
2个回答

3
你需要在你的Container类中实现一个类似于Stream接口的forEach方法:
void forEach(Consumer<? super T> action) 
{
    for (int i = 0; i < array.length; i++)
        action.accept(array[i]);
}

这个 forEach 实现是串行的,所以比 Stream 实现更简单,Stream 实现也可以并行。
我忽略了 T[] array = new T[200]; 不能通过编译这一事实,因为那是另一个问题。

1
T[] array = (T[]) new Object[200]; 抱歉。 - Hobbyist
3
当然,for(T t: array) action.accept(t); 也可以做到同样的效果... - Holger

2
我建议您创建一个返回流的方法:
Stream<T> stream() {
    return Arrays.stream(array);
    // or probably Arrays.stream(array, 0, size); if it's used partially
}

这样一来,用户不仅可以使用forEach,还能使用流支持的每个操作。

2
是的!返回一个流比暴露一个简单的forEach更有用。 - Stuart Marks
1
然而,这并不是问题所要求的。 - Hobbyist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接