【发布时间】:2020-05-16 13:14:28
【问题描述】:
我的自定义迭代器有问题,所以我寻求您的帮助。我有 MyIterator 类,它是一个带有转换的迭代器。这个类有方法:
- next() - 返回下一个元素
- hasNext() - 检查下一个元素是否存在
- fromIterator - 静态方法,将 Iterator 转换为 MyIterator
- map - 采用函数式接口并返回 MyIterator 以及对应于该接口的转换规则的方法
-
forEach - 采用功能接口并根据接口迭代所有剩余对象的方法。
我的实现是
import java.util.Iterator;
import java.util.function.Consumer;
import java.util.function.Function;
public class MyIterator<K, V> {
private final Iterator<K> iterator;
private final Function<K, V> function;
@SuppressWarnings("unchecked")
public static <K, V> MyIterator<K, V> fromIterator(Iterator<K> iterator) {
return new MyIterator<>(iterator, k -> (V) k);
}
private MyIterator(Iterator<K> iterator, Function<K, V> function) {
this.iterator = iterator;
this.function = function;
}
public V next() {
return this.function.apply(iterator.next());
}
public boolean hasNext() {
return this.iterator.hasNext();
}
public MyIterator<K, V> map(Function<K, V> function) {
return new MyIterator<K, V>(this.iterator, this.function);
}
public void forEach(Consumer<V> action) {
while (hasNext()) {
action.accept(this.next());
}
}
}
所以,我做了这个任务,但我不明白,如何将方法 map 更改为链接方法(管道)。我的意思是:
MyIterator<String, Integer> myIterator3 = MyIterator.fromIterator(stringsArray.iterator()).map(s -> s.length()).map(i -> i.toString()).map(s -> s.length());
例如,我有字符串“England”。在第一张地图之后,我想得到 7(“England”由 7 个字符组成),而不是“7”,而不是 1(因为字符串“7”由 1 个字符组成)。
我的假设是我应该在我的方法映射中使用方法 andThen/compose,但我不明白如何。
【问题讨论】:
-
首先,您的
map方法将函数作为您完全忽略的参数。 -
为什么你认为迭代器需要两个泛型类型参数? K 和 V 传统上代表“键”和“值”。在这种情况下,它们没有意义。这个
k -> (V) k应该作为一个线索,表明你正在做的事情没有多大意义 -
@Michael,谢谢你的回答!我使用两个泛型类型参数,否则我将无法将 Function
作为我的类的一个字段。您还写了忽略函数的 map 方法,我理解,但除此之外我不知道如何使用此函数:return new MyIterator(它是必要的)与函数字段,其中函数看起来像 f1 .compose(f2).compose(f3)。等等,取决于在这个 MyIterator 对象上调用 .map 的次数。反正我是真的不知道怎么弄。那么,对吗? -
何不试试看?
-
@Michael,我试过了,还是不行,因为方法andThen需要Function
,所以不能只写 return new MyIterator(this.iterator, this.function.andThen(function));。因此,这种方法是不正确的或者我不明白这个功能是如何工作的
标签: java