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

How to check if Collection is not empty using 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

The method orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND)) is undefined for the type Stream<ResponseEntity<User>>

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

Iterable<T> findAll(Iterable<PK> pks);

那要看你对流的终端操作了,记住一个流只能消费一次。

  • 是分组by/statistics操作吗?然后你会得到一个 0 计数或一个空的组映射。
  • 如果它收集到一个列表中,那么它就是一个空列表。
  • 如果它是 returns 和 Optional 的方法之一(例如 findAny),那么您可以使用可选的空值检查方法。

将所有内容都塞进一行是没有必要的,而且往往是错误的。在这种情况下,您不能 - 没有这样的 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));

你把两件事搞混了。第一个任务是将 Iterable 转换为 Collection,您确实可以使用 Stream API:

来解决
Collection<User> list=
    StreamSupport.stream(userRepository.findAll(pks).spliterator(), false)
   .collect(Collectors.toList());

请注意,此流是 Users 的 流,而不是列表流。因此,您无法使用此流将 list 映射到其他内容。 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) ));