Как проверить, не пуста ли коллекция с помощью 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());

обратите внимание, что этот поток является поток Users, а не поток списков. Поэтому вы не можете отобразить 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.