如何包装java.util.Iterator以更改正在迭代的对象的类型

如何包装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的迭代器支持 我考虑使

我正在为第三方API提供一些facade类,我需要包装一个迭代器,以便用我自己的facade对象替换迭代的内容

下面是我的facade类的简化版本,它封装了一个名为Item的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)