Как проверить, не пуста ли коллекция с помощью Java Stream
Я новичок в Java 8. Я не могу понять, что не так в следующем фрагменте кода. Идея отправлено Collection<User>
если он не пуст. Но если коллекция пуста, чем отправлено HttpStatus.NOT_FOUND
сущности ответ.
@RequestMapping(value = "/find/pks",
method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Collection<User>> getUsers(@RequestBody final Collection<String> pks)
{
return StreamSupport.stream(userRepository.findAll(pks).spliterator(), false)
.map(list -> new ResponseEntity<>(list , HttpStatus.OK))
.orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND));
}
Eclipse показывает мне ошибку в следующем пункте .orElse
метод
orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND))
не определено для типаStream<ResponseEntity<User>>
мой базовый метод интерфейса выглядит следующим образом
Iterable<T> findAll(Iterable<PK> pks);
3 ответов
вы путаете две вещи. Первая задача-преобразовать Iterable
до Collection
что вы действительно можете решить с помощью Stream
API:
Collection<User> list=
StreamSupport.stream(userRepository.findAll(pks).spliterator(), false)
.collect(Collectors.toList());
обратите внимание, что этот поток является поток User
s, а не поток списков. Поэтому вы не можете отобразить list
к чему-то еще с этим потоком. The map
операция карта в каждом элементе из потока в новый элемент.
затем вы можете использовать этот список для создания ResponseEntity
return list.isEmpty()? new ResponseEntity<>(HttpStatus.NOT_FOUND):
new ResponseEntity<>(list, HttpStatus.OK);
вы можете объединить эти шаги, создав Collector
выполнение этих шагов, хотя это не дает никаких преимуществ, это только вопрос стиля:
ResponseEntity<User> responseEntity=
StreamSupport.stream(userRepository.findAll(pks).spliterator(), false)
.collect(Collectors.collectingAndThen(Collectors.toList(),
list -> list.isEmpty()? new ResponseEntity<>(HttpStatus.NOT_FOUND):
new ResponseEntity<>(list, HttpStatus.OK) ));
это не обязательно, и часто ошибка, чтобы втиснуть все в одну строку. В этом случае, вы не можете - нет такого API для вашего намерения.
сохранить его простым:
Collection<User> list = <your stream code that gets a list>;
if (list.isEmpty())
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
return new ResponseEntity<>(list, HttpStatus.OK);
но если вы абсолютно должны:
return <your code>.map(list -> new ResponseEntity<>(list, list.isEmpty() ? HttpStatus.NOT_FOUND : HttpStatus.OK));
это зависит от вашей терминальной работы потока, помните, что поток можно использовать только один раз.
- это операция группировки по / статистике? Затем вы получите счет 0 или пустую карту групп.
- если он собирается в список, то это пустой список.
- если это один из методов, который возвращает
Optional
(например,findAny
), то вы можете использовать необязательные методы проверки null.