#java #spring-boot
Вопрос:
Получите количество элементов с List
помощью size()
метода, но как получить количество элементов с помощью Optional<entityname>
.
В Списке:
List<User> data = this.Service.getUserById(id);
System.out.print(data.size());
В Необязательном:
Optional<User> data = this.Service.getUserById(id);
System.out.print(); // how to get in Optional
Комментарии:
1. Это либо 1, либо 0. Это не список, это один
User
, который может присутствовать, а может и не присутствовать.2. Только не с
Optional
С. Если этот метод возвращаетOptional<User>
, он должен возвращать одинUser
или ничего. Ничего не поделаешь. Если вам нужен метод, который возвращает более одной вещи, он должен возвращать aList
или (если вы используете данные spring) aPage
. (теперь похоже, что я разговариваю сам с собой , но был комментарий OP, в котором спрашивалось, как считать элементы в anOptional
, которые они затем удалили, но я все равно оставляю это здесь)3. Мне очень жаль, @FedericoklezCulloca
Ответ №1:
Вам нужно думать, что ваш список ( data
) находится внутри Optional
. Поэтому вам нужно преобразовать ( map
) этот список в размер этого списка, и возвращаемое значение (например, orElseGet) или возвращаемое значение 0 равно нулю. Вы могли бы попробовать что-то вроде этого:
Optional<User> data = this.Service.getUserById(id);
int size = data .map(List::size).orElseGet(() -> Integer.valueOf(0)).intValue();
// or int size = data .map(List::size).orElse(0);
Комментарии:
1. Но внутри
Optional
есть аUser
, а не аList
, так как же вы можете сопоставить его сList::size
?2. Извините, я ошибся. У тебя было
List<User> data = this.Service.getUserById(id);
так вот почему я подумал, что ты пересмотришь список.Optional
равно <0, 1>, а список равен <0, 1><0, бесконечность>. Чтобы проверить, было ли что-то найдено, вам нужно использоватьisPresent
. Если у вас будет список внутриOptional<List<User>>
, то мое решение будет работать. Почему в вашем примере функцияgetUserById
возвращает список?
Ответ №2:
Это Optional<User>
не список, то, что вы возвращаете, может быть одним пользователем или нет, и ваша задача-проверить, вернул ли он ОДНОГО пользователя или нет. Необязательный параметр содержит User
не a List<User>
Если вы хотите получить пользователя, если он был возвращен, есть несколько способов.
Это один из способов получить пользователя, но это всего лишь пример кода, и его не следует использовать ни в одном производственном сценарии, поскольку он более подробен, чем нужно, и здесь, чтобы объяснить общую идею. но, как уже упоминалось, в ссылке в конце поста есть несколько других способов.
// This line returns maybe a single user, not a list of users.
Optional<User> data = this.Service.getUserById(id);
if(data.isPresent()) {
final User user = data.get();
}
Вы можете прочитать больше об использовании дополнительных опций здесь:
Комментарии:
1. Обычно использование
isPresent
считается антипаттером. Вместо этого используйтеorElseGet
илиorElseThrow
.2. и, как я уже упоминал, есть несколько способов, я никоим образом не говорил, что это был шаблон для использования. О чем ты, кажется, думаешь. Поскольку пользователь является полным новичком, этот пример является самым простым и понятным для понимания.
3. @M. Deinum Можете ли вы рассказать мне, как получить данные из базы данных и подсчитать общее количество данных. В java мы используем
resultset.last()
, но что в spring boot4. Весенняя загрузка-это Java… Так что ваш вопрос на самом деле не имеет смысла. Я предлагаю ознакомиться с тем, что вы используете (в данном случае Spring Boot. В вашем случае консультирование о том, что использовать, невозможно, так как мы не знаем, что
this.service
это такое и как это реализовано.5. @Toerktumlare проблема с тупыми советами заключается в том, что люди склонны придерживаться их. Поэтому, если кто-то дает советы, он должен давать лучшую практику имхо.