Проблема с использованием приложения FindAll с вызовом groovy collect

#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(), о котором я думаю. Спасибо, что изучили это.