dit*_*lav 5 java lambda iterable shadowing java-8
所以我有我朋友给我看的这段代码,我必须承认我不明白发生了什么。我了解围绕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();
}
};
};
}
Run Code Online (Sandbox Code Playgroud)
我有这个版本,但是我有一个阴影问题,我自己在内部调用实现值的Iterable的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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
注意:此iterator()属于variables()的范围
public Iterator<SimpleHashtable.TableEntry<K, V>> iterator() {
return new TableEntryIterator();
}
Run Code Online (Sandbox Code Playgroud)
Lambda表达式用于实现功能接口,其中只有一种方法需要实现。因此,由于您的values()方法返回了Iterable<V>,因此lambda表达式必须实现该接口的单个方法,即iterator()。
至于您的示例中的lambda表达式的语法:
空括号()表示由lambda表达式实现的方法没有参数,对于该iterator()方法确实如此。
在之后->,您拥有lambda表达式的主体,该主体在此示例中返回实现该Iterator<V>接口的匿名类的实例。
哦,您的第二段代码会导致堆栈溢出,因为您的iterator()方法创建了的实例ValuesIterator,并且在实例初始化的过程中调用了该iterator()方法,从而导致了无限递归。
| 归档时间: |
|
| 查看次数: |
1711 次 |
| 最近记录: |