问题
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);
回答1:
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) ));
回答2:
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));
回答3:
That depends on your terminal operation of the stream, remember that a stream can only be consumed once.
- Is it a grouping by/statistics operation? Then you'll get a 0 count or an empty map of groups.
- If it collects into a list then it's an empty list.
- If it's one of the methods that returns an
Optional
(such asfindAny
) then you can use the optional's null-checking methods.
来源:https://stackoverflow.com/questions/30631650/how-to-check-if-collection-is-not-empty-using-java-stream