如何使用 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());
请注意,此流是 User
s 的 流,而不是列表流。因此,您无法使用此流将 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) ));
我是 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 typeStream<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());
请注意,此流是 User
s 的 流,而不是列表流。因此,您无法使用此流将 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) ));