[英]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
方法
orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND))
未定義類型Stream<ResponseEntity<User>>
我的基本接口方法如下所示
Iterable<T> findAll(Iterable<PK> pks);
把一切都塞進一行是沒有必要的,而且經常是錯誤的。 在這種情況下,你不能 - 你的意圖沒有這樣的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
轉換為您可以使用Stream
API解決的Collection
:
Collection<User> list=
StreamSupport.stream(userRepository.findAll(pks).spliterator(), false)
.collect(Collectors.toList());
請注意,此流是User
流 ,而不是列表流。 因此,您無法使用此流將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) ));
這取決於您對流的終端操作,請記住,流只能被消耗一次。
Optional
的方法之一(例如findAny
),那么您可以使用可選的null檢查方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.