所以我有我朋友给我看的这段代码,我必须承认我不明白发生了什么。我了解有关 Lamba 表达式的概念,并且在 haskell 中编写了很多,但到目前为止还没有在 Java 中编写。
令我困惑的是编译器如何知道我认为是 lambda 的函数应该是 Iterable 接口中所需的“iterator()”。
public Iterable<V> values() {
return () -> {
return new Iterator<V>() {
private Iterator<TableEntry<K, V>> iter = iterator();
@Override
public boolean hasNext() {
return iter.hasNext();
}
@Override
public V next() {
return iter.next().getValue();
}
};
};
}
我有我的这个版本,但是我有一个阴影问题,我为实现 Iterable for values 所做的 iterator() 在其内部被调用,导致堆栈溢出。我想要的是使用在 values() 范围内定义但不知道如何指向它的 iterator()。
public Iterable<V> values() {
return new ValuesIterable<V>();
}
public class ValuesIterable<V> implements Iterable<V>{
public Iterator<V> iterator() {
return new ValuesIterator();
}
public class ValuesIterator implements Iterator<V>
{
Iterator<SimpleHashtable.TableEntry<K, V>> iter = (Iterator<TableEntry<K, V>>) iterator();
public boolean hasNext()
{
return iter.hasNext();
}
public V next()
{
return iter.next().getValue();
}
public void remove()
{
return;
}
}
}
注意:这个 iterator() 在 variables() 的范围内
public Iterator<SimpleHashtable.TableEntry<K, V>> iterator() {
return new TableEntryIterator();
}