I am new to Java 8. I am not able to understand what is wrong in the following piece of code. The idea is to sent Collection<User>
if its not empty. But if the collection is empty than sent HttpStatus.NOT_FOUND
Entity response.
@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 shows me error in the following point .orElse
The method
orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND))
is undefined for the typeStream<ResponseEntity<User>>
My base interface method looks like following
Iterable<T> findAll(Iterable<PK> pks);
You are mixing two things up. The first task is to convert the Iterable
to a Collection
which you can indeed solve using the Stream
API:
Collection<User> list=
StreamSupport.stream(userRepository.findAll(pks).spliterator(), false)
.collect(Collectors.toList());
Note that this stream is a stream of User
s, not a stream of lists. Therefore you can’t map a list
to something else with this stream. The map
operation will map each element of the stream to a new element.
Then you can use this list to create the ResponseEntity
return list.isEmpty()? new ResponseEntity<>(HttpStatus.NOT_FOUND):
new ResponseEntity<>(list, HttpStatus.OK);
You can combine these steps by creating a Collector
performing this steps though this does not provide any advantage, it’s only a matter of style:
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) ));
It's not necessary, and often a mistake, to cram everything into one line. In this case, you can't - there's no such API for your intention.
Keep it simple:
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);
but if you absolutely must:
return <your code>.map(list -> new ResponseEntity<>(list, list.isEmpty() ? HttpStatus.NOT_FOUND : HttpStatus.OK));
That depends on your terminal operation of the stream, remember that a stream can only be consumed once.
Optional
(such as findAny
) then you can use the optional's null-checking methods.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With