#java #groovy
#java #groovy
Вопрос:
Отличный вопрос. У меня есть следующий тестовый пример. Мне нужно выполнить поиск в коллекции и собрать все события в тот же день, что и date1. Я добавил приложение findAll в конец вызова collect, поскольку я не могу проверить тот же день в коллекции. Я вижу ошибку «Не удается получить доступ к элементу last() из пустого списка» при проверке метода .last(), если список пуст даже без ?.last(), используемого при проверке условий. Если я удаляю findAll из вызова collect, он работает как обычно, и я не понимаю, почему. Я всегда выполняю проверку этого условия с вызовом collect для создания нового экземпляра, если его нет в списке, но не с приложением findAll в конце. Почему это могло бы иметь значение?
Date date1 = new Date();
List<Event> lEvents = test.collect("events").findAll{ d ->
DateUtils.isSameDay(d.testdate, d1);
}
Event newEvent = lEvents?.last() ?: new Event();
Ответ №1:
В сообщении об ошибке говорится, что список пуст, а не о том, что он равен null, поэтому ?
in ?.last()
не имеет никакого значения. Это исключение ’empty list’ всегда выдается при попытке извлечь последний элемент пустого списка, по очевидным причинам. Вы findAll
отфильтровываете все и возвращаете пустой список, что вызывает ошибку.
Вы говорите, что таким образом вы всегда проверяете наличие пустого списка, поэтому неясно, как ваш другой код может вызывать last()
пустой список без выдвижения. У вас точно есть случаи, когда collect()
возвращает пустой список?
Чтобы исправить этот конкретный случай, вы могли бы сделать:
Event newEvent = (lEvents.size() > 0) ? lEvents.last() : new Event()
Комментарии:
1. Я постоянно использую метод collect таким образом, и по какой-то причине он не выдает ошибку empty list при его использовании, подобном этому событию nEvent= lEvents.last()?: new Event() , но с приложением FindAll в конце метода collect он выдает. Вы даже можете выполнить вызов collect().last(), и если есть пустой список, он не выдает ошибку empty list, если сбор завершается неудачно, он просто возвращает null. findAll должен обрабатывать отчет о пустом списке иначе, чем метод collect(), о котором я думаю. Спасибо, что изучили это.