gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:39:02 25 4
gpt4 key购买 nike

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

这是我的外观类的简化版本,它包装了一个名为 Item

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

API 提供了这种形式的迭代器 Iterator<Item>

我需要实现这种形式的迭代器 Iterator<FacadeItem>由 API 的迭代器支持。

我考虑过使用 ForwardingIterator来自 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());
}
}

但是 next() 的覆盖编译器不允许,因为它期望返回的类型是 Item,而不是 FacadeItem

最佳答案

Iterator 接口(interface)不是那么大,所以您可以编写自己的委托(delegate)迭代器:

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
}

然后

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

如果您使用的是 Guava,则可以使用他们的 Iterators.transform为您制作其中之一的静态方法:

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

在 Java 1.8 中,这个选项变得非常简单:

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

关于java - 如何包装 java.util.Iterator 以更改被迭代对象的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23690734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com