一切都可以是返回类型:枚举,类,接口,int,异常等。
Iterable
是一个接口,可用于在foreach调用中使用返回值(这就是为什么您可以使用for(T something : AnArrayList)
,因为ArrayList<T>
实现了Iterable<T>
)
现在,我的回答包含一个示例:
我们有一个方法getNeighbours
,它返回Iterable<ClientInterface>
public Iterable<ClientInterface> getNeighbours()
{
return new Iterable<ClientInterface>();
}
好的,既然Iterable
只是一个接口,我们需要实现方法或使用一个实现。
既然这是需要我们手动完成的事情,我们应该自己实现这些方法。
在Java8中,唯一的方法(虽然有3个方法,但我们将忽略它们)是iterator()
,它返回一个iterator
。
public Iterable<ClientInterface> getNeighbours()
{
return new Iterable<ClientInterface>()
{
@Override
public Iterator<ClientInterface> iterator()
{
return null;
}
};
}
Iterator
是另一个接口,用于提供迭代集合、项列表等的逻辑。
我们被迫实现两个方法:hasNext 和 next
hasNext
用于确定是否还有更多项可迭代,next
用于进行迭代。
public Iterable<ClientInterface> getNeighbours()
{
return new Iterable<ClientInterface>()
{
@Override
public Iterator<ClientInterface> iterator()
{
return new Iterator<ClientInterface>()
{
@Override
public boolean hasNext()
{
return false;
}
@Override
public ClientInterface next()
{
return null;
}
};
}
};
}
我们需要记住最后的位置,因此在迭代器中创建一个字段。
public Iterable<ClientInterface> getNeighbours()
{
return new Iterable<ClientInterface>()
{
@Override
public Iterator<ClientInterface> iterator()
{
return new Iterator<ClientInterface>()
{
private int position;
@Override
public boolean hasNext()
{
return false;
}
@Override
public ClientInterface next()
{
return null;
}
};
}
};
}
这里的问题是:我们应该迭代什么?这取决于您,一个例子可能是:
public Iterable<ClientInterface> getNeighbours()
{
return new Iterable<ClientInterface>()
{
@Override
public Iterator<ClientInterface> iterator()
{
return new Iterator<ClientInterface>()
{
private int position;
private ClientInterface[] items = new ClientInterface[]{new ClientInterface(), new ClientInterface()};
@Override
public boolean hasNext()
{
return position != items.length;
}
@Override
public ClientInterface next()
{
if (!hasNext()) throw new NoSuchElementException();
return items[position++];
}
};
}
};
}
请注意这里我们创建了一个项目数组,并使用
hasNext
和
next
两种方法提供一种遍历它的方式。
每次调用
next
都会增加内部指针,而我们的hasNext方法只是检查指针是否到达了数组的末尾。
像
ArrayList
、
LinkedList
等这样的集合已经为您完成了工作,并且更好(实现了
remove
方法),您可以使用
ArrayList.iterator()
来获取此迭代器。
现在,您可以写出如下内容:
for (ClientInterface el : yourClass.getNeighbours())
{
System.out.println(el);
}