简体   繁体   English

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

[英]How to wrap a java.util.Iterator to change the type of object being iterated

I am providing some facade classes for a third-party API and I need to wrap an iterator so that I can replace what is iterated with my own facade object. 我正在为第三方API提供一些外观类,我需要包装一个迭代器,以便我可以替换用我自己的外观对象迭代的东西。

Here's a simplified version of my facade class that wraps an API class called Item 这是我的facade类的简化版本,它包装了一个名为Item的API类

class FacadeItem {
    Item item;
    FacadeItem(Item item) {
        this.item = item;
    }
}

The API provides an iterator of this form Iterator<Item> API提供此表单Iterator<Item>

I need to implement an iterator of this form Iterator<FacadeItem> that is backed by the iterator of the API. 我需要实现这个形式Iterator<FacadeItem>的迭代器,它由API的迭代器支持。

I considered using the ForwardingIterator from the Guava library as follows: 我考虑过如下使用Guava库中的ForwardingIterator

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());
    }
}

but the Override of next() is not permitted by the compiler because it is expecting the returned type to be Item , not FacadeItem 但是编译器不允许覆盖next() ,因为它期望返回的类型是Item ,而不是FacadeItem

The Iterator interface isn't that big, so you could just write your own delegating iterator: Iterator接口不是那么大,所以你可以编写自己的委托迭代器:

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
}

and then 接着

Iterator<FacadeItem> facadeIterator = new FacadeIterator(itemIterator);

If you're using Guava, you can use their Iterators.transform static method to make one of these for you: 如果你正在使用Guava,你可以使用他们的Iterators.transform静态方法为你制作其中一个:

Iterator<FacadeItem> facadeIterator = Iterators.transform(itemIterator,
    /* anon class of Function<Item, FacadeItem> */);

And in Java 1.8, this option becomes really easy: 在Java 1.8中,这个选项变得非常简单:

Iterator<FacadeItem> facadeIterator
    = Iterators.transform(itemIterator, FacadeItem::new)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 java.util.Iterator<java.lang.Object[]> 无法转换为 java.util.Iterator<T[]> - java.util.Iterator<java.lang.Object[]> cannot be converted to java.util.Iterator<T[]> 关闭java.util.Iterator - Closing a java.util.Iterator java.util.Iterator但不能导入java.util.Iterator - java.util.Iterator but cannot import java.util.Iterator 摆脱 java.util.Iterator - Getting rid of java.util.Iterator 未经检查的分配:“匿名java.util.Iterator”到“ java.util.Iterator” <java.lang.Integer> &#39; - Unchecked assignment: 'anonymous java.util.Iterator' to 'java.util.Iterator<java.lang.Integer>' java.lang.NullPointerException:尝试在空对象引用上调用接口方法“java.util.Iterator java.util.List.iterator()” - java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference 过滤器出错:尝试在空对象引用上调用接口方法&#39;java.util.Iterator java.util.List.iterator()&#39; - Error on filter: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference 在NeoMAD项目中使用java.util.Iterator时出错 - Error when using java.util.Iterator in a NeoMAD project 为什么 <ui:repeat> 与java.util.Iterator不兼容? - Why does <ui:repeat> not work with java.util.Iterator? 不兼容的类型-找到了java.util.Iterator(Lot),但是需要使用java.util.Iterator(java.lang.String) - incompatible types - found java.util.Iterator(Lot) but expected java.util.Iterator (java.lang.String)
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM