[英]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.