如何包装java.util.Iterator以更改正在迭代的对象的类型
我正在为第三方API提供一些facade类,我需要包装一个迭代器,以便用我自己的facade对象替换迭代的内容 下面是我的facade类的简化版本,它封装了一个名为Item的API类如何包装java.util.Iterator以更改正在迭代的对象的类型,java,collections,guava,iterator-facade,Java,Collections,Guava,Iterator Facade,我正在为第三方API提供一些facade类,我需要包装一个迭代器,以便用我自己的facade对象替换迭代的内容 下面是我的facade类的简化版本,它封装了一个名为Item的API类 class FacadeItem { Item item; FacadeItem(Item item) { this.item = item; } } API提供了这种形式的迭代器iterator 我需要实现这种形式的迭代器iterator,它由API的迭代器支持 我考虑使
class FacadeItem {
Item item;
FacadeItem(Item item) {
this.item = item;
}
}
API提供了这种形式的迭代器iterator
我需要实现这种形式的迭代器iterator
,它由API的迭代器支持
我考虑使用Guava图书馆提供的数据,如下所示:
class FacadeItemIterator<FacadeItem> extends ForwardingIterator<Item> {
final Iterator<Item> delegate; // backing iterator
FacadeItemIterator(Iterator<Item> delegate) {
this.delegate = delegate;
}
@Override protected Iterator<Item> delegate() {
return delegate;
}
@Override
public FacadeItem next() {
return new FacadeItem(super.next());
}
}
类FacadeItemIterator扩展了ForwardingIterator{
最终迭代器委托;//支持迭代器
FacadeItemIterator(迭代器代理){
this.delegate=委托;
}
@重写受保护的迭代器委托(){
返回代表;
}
@凌驾
公共设施项目下一步(){
返回新FacadeItem(super.next());
}
}
但是编译器不允许重写
next()
,因为它希望返回的类型是Item,而不是FacadeItem,迭代器接口没有那么大,所以您可以编写自己的委托迭代器:
class FacadeItem {
Item item;
FacadeItem(Item item) {
this.item = item;
}
}
class FacadeIterator implements Iterator<FacadeItem> {
private final Iterator<Item> delegate; // set in ctor
@Override
public FacadeItem next() {
return new FacadeItem(delegate.next());
}
// the other two methods just delegate straight
}
在Java 1.8中,此选项变得非常简单:
Iterator<FacadeItem> facadeIterator
= Iterators.transform(itemIterator, FacadeItem::new)
迭代器facadedierator
=迭代器.transform(itemIterator,FacadeItem::new)
回答得很好。为了完整起见,我只想对稍后可能讨论的人说,在第一个解决方案中需要覆盖的“其他两个方法”是hasNext()和remove()
Iterator<FacadeItem> facadeIterator
= Iterators.transform(itemIterator, FacadeItem::new)