所以我有这段代码,我的朋友给我看了,我必须承认我不明白发生了什么.我理解lamba表达式的概念,并且已经在
haskell中编写了相当多的内容,但到目前为止还没有在
Java中编写过.
令我困惑的是编译器如何知道我认为是lambdaed的函数应该是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();
}
};
};
}
我有我的版本,但我有阴影的问题,我实现的iterator()实现值的Iterable本身调用导致堆栈溢出.我想要的是使用在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()在变量()的范围内
public Iterator<SimpleHashtable.TableEntry<K, V>> iterator() {
return new TableEntryIterator();
}
最佳答案 Lambda表达式用于实现功能接口,其中只有一种方法需要实现.因此,由于您的values()方法返回Iterable< V>,因此lambda表达式必须实现该接口的单个方法,即iterator().
至于示例中lambda表达式的语法:
空的方括号()表示lambda表达式实现的方法没有参数,对于iterator()方法确实如此.
在>之后,你有lambda表达式的主体,在这个例子中,它返回一个实现Iterator< V>的匿名类的实例.接口.
哦,你的第二个代码片段导致堆栈溢出,因为你的iterator()方法创建了ValuesIterator的一个实例,并且作为实例初始化的一部分,你调用iterator()方法,导致无限递归.