Давайте посмотрим на этот пример:Почему iterator.forEachRemaining не удаляет элемент в потребительской лямбда?
public class ListIteratorTest {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("element1");
list.add("element2");
list.add("element3");
list.add("element4");
ListIterator<String> iterator = list.listIterator();
}
}
И сейчас, это работает отлично:
// prints elements out, and then appropriately removes one after another
while (iterator.hasNext()){
System.out.println(iterator.next());
iterator.remove();
}
в то время как это бросает IllegalStateException:
// throws IllegalStateException, why?
iterator.forEachRemaining(n -> {
System.out.println(n);
iterator.remove();
});
Мой вопрос короток: почему ?
Лямбда-выражения (и, конечно же, ссылки на методы) также имеют большое преимущество в создании гораздо более читаемого или чистого кода. Я стараюсь использовать их везде, где я получаю реальную пользу - с точки зрения удобочитаемости - от них. Ваш пример лямбда не читается или менее читабельен, чем пример, который не использует выражение лямбда. Фактически, он имеет такое же количество кодовых строк. Так почему вы чувствуете, что вы должны (или должны) использовать лямбда здесь? Фактически ... вы обнаружили это ... они делают ваш код несколько сложным, так как вы не должны использовать итератор внутри лямбды. – Seelenvirtuose
@Seelenvirtuose Я все еще участвую в обучении Java8, поэтому я стараюсь использовать lambdas и т. Д. Везде, где только могу. Я просто подумал, что если это возможно, и я хотел бы проверить это - это дало неожиданные результаты, и я не знал, почему так спросил здесь; но спасибо за объяснение того, что на самом деле сделано для lambas - для простоты, где это возможно, – azalut