Java noob here,
我想要Iterator<TypeA>
转换为Iterator<TypeB>
。 TypeA和TypeB不能直接相互转换,但我可以写一个规则如何转换它们。我怎么能做到这一点?我应该扩展并覆盖Iterator<TypeA>
下一个,hasNext和删除方法吗?
感谢。
答案 0 :(得分:15)
您不需要自己编写。 Guava(以前的Google收藏)让您了解Iterators.transform(...)
你提供了你的迭代器和一个将TypeA转换为TypeB的函数,你已经完成了。
Iterator<TypeA> iterA = ....;
Iterator<TypeB> iterB = Iterators.transform(iterA, new Function<TypeA, TypeB>() {
@Override
public TypeB apply(TypeA input) {
TypeB output = ...;// rules to create TypeB from TypeA
return output;
}
});
答案 1 :(得分:7)
写一个adapter。这是Java中的an example。 OReilly的书'Head First: Design Patterns'给出了关于该主题的最佳解释。
答案 2 :(得分:4)
我猜你应该用方法中的((转换))规则编写自己的迭代器(它可以实现java.util.iterator)并使用它。
答案 3 :(得分:2)
您可以使用以下代码段:
public static void main(String... args){
Iterator<TypeA> iteratorTypeA = methodToGetIteratorTypeA();
Iterator<TypeB> iteratorTypeB = new IteratorConveter<TypeA, TypeB>(iteratorTypeA,
new Converter<TypeA, TypeB>(){
public TypeB convert(TypeA typeA){
return null; //Something to convert typeA to type B
}
});
}
public class IteratorConveter<F, T> implements Iterator<T> {
private final Converter<? super F, ? extends T> converter;
private final Iterator<F> iterator;
public IteratorConveter(Iterator<F> iterator, Converter<? super F, ? extends T> converter) {
this.converter = converter;
this.iterator = iterator;
}
public boolean hasNext() {
return iterator.hasNext();
}
public T next() {
return converter.convert(iterator.next());
}
public void remove() {
iterator.remove();
}
}
interface Converter<F, T> {
T convert(F object);
}
答案 4 :(得分:1)
由于Java中的Generics只是一个编译时构造,我觉得你最好不要在调用next()
时转换你检索的每个元素,而不是强制转换迭代器。
答案 5 :(得分:1)
拥有一个他们共享的超类可能是一个好主意,但这取决于这两种类型的确切定义,或者甚至可能有一种继承自另一种,因为它们似乎是两种表示形式对于相同的数据。这也可以解决你的迭代器问题。
或者您可以编写一个容器,该容器在内部使用其中一个进行数据访问,并且对外部世界具有流畅的表示。我指的是“构图而不是继承”。
但从本质上讲,这一切都归结为:你是否认真思考过你的班级结构?你确定它尽可能好吗?