簡體   English   中英

如何使用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

方法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) ));

這取決於您對流的終端操作,請記住,流只能被消耗一次。

  • 它是/統計操作的分組嗎? 然后你會得到一個0計數或一組空的地圖。
  • 如果它收集到列表中,那么它是一個空列表。
  • 如果它是返回Optional的方法之一(例如findAny ),那么您可以使用可選的null檢查方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM