Как получить количество элементов с помощью дополнительного

#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 или ничего. Ничего не поделаешь. Если вам нужен метод, который возвращает более одной вещи, он должен возвращать a List или (если вы используете данные spring) a Page . (теперь похоже, что я разговариваю сам с собой , но был комментарий OP, в котором спрашивалось, как считать элементы в an Optional , которые они затем удалили, но я все равно оставляю это здесь)

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(); 
}
 

Вы можете прочитать больше об использовании дополнительных опций здесь:

Дополнительные возможности Java

Комментарии:

1. Обычно использование isPresent считается антипаттером. Вместо этого используйте orElseGet или orElseThrow .

2. и, как я уже упоминал, есть несколько способов, я никоим образом не говорил, что это был шаблон для использования. О чем ты, кажется, думаешь. Поскольку пользователь является полным новичком, этот пример является самым простым и понятным для понимания.

3. @M. Deinum Можете ли вы рассказать мне, как получить данные из базы данных и подсчитать общее количество данных. В java мы используем resultset.last() , но что в spring boot

4. Весенняя загрузка-это Java… Так что ваш вопрос на самом деле не имеет смысла. Я предлагаю ознакомиться с тем, что вы используете (в данном случае Spring Boot. В вашем случае консультирование о том, что использовать, невозможно, так как мы не знаем, что this.service это такое и как это реализовано.

5. @Toerktumlare проблема с тупыми советами заключается в том, что люди склонны придерживаться их. Поэтому, если кто-то дает советы, он должен давать лучшую практику имхо.