如何使用java Stream检查Collection是否为空

Sau*_*mar 8 java lambda java-8 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));
}
Run Code Online (Sandbox Code Playgroud)

Eclipse在以下方面向我显示错误 .orElse

orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND))类型的方法未定义Stream<ResponseEntity<User>>

我的基本接口方法如下所示

Iterable<T> findAll(Iterable<PK> pks);
Run Code Online (Sandbox Code Playgroud)

Boh*_*ian 5

把一切都塞进一行是没有必要的,而且经常是错误的.在这种情况下,你不能 - 你的意图没有这样的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);
Run Code Online (Sandbox Code Playgroud)

但如果你绝对必须:

return <your code>.map(list -> new ResponseEntity<>(list, list.isEmpty() ? HttpStatus.NOT_FOUND : HttpStatus.OK));
Run Code Online (Sandbox Code Playgroud)


Hol*_*ger 5

您正在混淆两件事。第一个任务是将转换IterableCollection你的确可以解决使用StreamAPI:

Collection<User> list=
    StreamSupport.stream(userRepository.findAll(pks).spliterator(), false)
   .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

请注意,这个流是User小号,没有列表的流。因此,您无法list使用此流将a映射到其他对象。该map操作会将流中的每个元素映射到一个新元素。

然后,您可以使用此列表创建 ResponseEntity

return list.isEmpty()? new ResponseEntity<>(HttpStatus.NOT_FOUND):
                       new ResponseEntity<>(list, HttpStatus.OK);
Run Code Online (Sandbox Code Playgroud)

您可以通过创建一个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) ));
Run Code Online (Sandbox Code Playgroud)