Итак, у меня есть этот код, который показал мне мой друг, и я должен признать, что не понимаю, что происходит. Я понимаю концепцию вокруг выражений lamba и написал немало из них в haskell, но пока нет в Java.Lambda expression in Iterable implementation
Что меня смущает, так это то, как компилятор знает, что функция, которую я предполагаю, лямбдай, должна быть «итератором» («требуется» в интерфейсе Iterable).
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 значений называется внутри себя вызывает переполнение стека. Я хочу использовать итератор(), который определяется в области значений(), но не знает, как указать на него.
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;
}
}
}
примечание: это итератор() находится в области видимости переменных()
public Iterator<SimpleHashtable.TableEntry<K, V>> iterator() {
return new TableEntryIterator();
}
Не могли бы вы пояснить синтаксис этого конкретного использования? – ditoslav
@DominikDitoIvosevic конечно, отредактированный ответ – Eran
Спасибо за этот короткий и полный ответ :) – ditoslav