Iterable 实现中的 Lambda 表达式
Lambda expression in Iterable implementation
所以我有朋友给我看的这段代码,我必须承认我不明白发生了什么。我了解有关兰巴表达式的概念,并且到目前为止已经在 haskell 中编写了很多,但在 Java 中编写了 none。
令我困惑的是编译器如何知道我认为是 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();
}
};
};
}
我有我自己的版本,但我有一个问题,我在为值实现 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;
}
}
}
注意:这个iterator()在variables()的范围内
public Iterator<SimpleHashtable.TableEntry<K, V>> iterator() {
return new TableEntryIterator();
}
Lambda表达式用于实现功能接口,其中只有一个方法需要实现。因此,由于您的 values()
方法 returns Iterable<V>
,lambda 表达式必须实现该接口的单一方法,即 iterator()
.
至于你例子中lambda表达式的语法:
空括号()
表示lambda表达式实现的方法没有参数,iterator()
方法确实如此
在 ->
之后,你有 lambda 表达式的主体,在这个例子中 returns 一个实现 Iterator<V>
接口的匿名 class 的实例.
哦,你的第二个代码片段导致堆栈溢出,因为你的 iterator()
方法创建了 ValuesIterator
的实例,并且作为实例初始化的一部分,你调用它 iterator()
方法,导致无限递归。
所以我有朋友给我看的这段代码,我必须承认我不明白发生了什么。我了解有关兰巴表达式的概念,并且到目前为止已经在 haskell 中编写了很多,但在 Java 中编写了 none。
令我困惑的是编译器如何知道我认为是 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();
}
};
};
}
我有我自己的版本,但我有一个问题,我在为值实现 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;
}
}
}
注意:这个iterator()在variables()的范围内
public Iterator<SimpleHashtable.TableEntry<K, V>> iterator() {
return new TableEntryIterator();
}
Lambda表达式用于实现功能接口,其中只有一个方法需要实现。因此,由于您的 values()
方法 returns Iterable<V>
,lambda 表达式必须实现该接口的单一方法,即 iterator()
.
至于你例子中lambda表达式的语法:
空括号()
表示lambda表达式实现的方法没有参数,iterator()
方法确实如此
在 ->
之后,你有 lambda 表达式的主体,在这个例子中 returns 一个实现 Iterator<V>
接口的匿名 class 的实例.
哦,你的第二个代码片段导致堆栈溢出,因为你的 iterator()
方法创建了 ValuesIterator
的实例,并且作为实例初始化的一部分,你调用它 iterator()
方法,导致无限递归。