2015-06-03 18 views
8

का उपयोग कर संग्रह खाली नहीं है या नहीं, यह जांचने के लिए कि मैं जावा 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)); 
} 

ग्रहण मुझे निम्नलिखित बिंदु .orElse

विधि orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND)) प्रकार Stream<ResponseEntity<User>>

मेरे आधार इंटरफेस विधि

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

Stream.map() स्ट्रीम स्ट्रीम करता है, और स्ट्रीम में कोई ऑरल() विधि नहीं होती है। एक इटरटेबल लौटकर आप अपना जीवन जटिल बना रहे हैं। आप एक सूची या सेट, या यहां तक ​​कि एक संग्रह वापस क्यों नहीं करते हैं, और उपयोग है लक्षण()? बीटीडब्ल्यू, आप जो मैपिंग कर रहे हैं वह एक सूची नहीं है, यह एक उपयोगकर्ता है।यदि आप वास्तव में Iterable का उपयोग करना जारी रखना चाहते हैं, तो iterable.iterator()। HasNext() का उपयोग यह देखने के लिए करें कि यह खाली है या नहीं। –

+0

इंटरफ़ेस स्प्रिंग पैकेजों में से एक द्वारा प्रदान किया जाता है।)))) –

+2

फिर iterable.iterator()। HasNext() का उपयोग यह देखने के लिए करें कि यह खाली है या नहीं। लेकिन उसने कहा, मैं इस तरह के मामले में 404 वापस नहीं आऊंगा। बस एक खाली सूची के साथ एक 200 वापस। 404 एक अज्ञात संसाधन के लिए है जिसे आप प्राप्त करने का प्रयास करते हैं। आप यहां संसाधनों की खोज कर रहे हैं, और कुछ भी नहीं ढूंढना एक वैध परिणाम है। –

उत्तर

4

आप दो चीजों को मिश्रण कर रहे हैं। पहला काम एक Collection जो आप वास्तव में Stream एपीआई का उपयोग कर हल कर सकते हैं करने के लिए Iterable कन्वर्ट करने के लिए है:

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

आपके उत्तर के लिए बहुत बहुत धन्यवाद। मैंने आपके कोड को संशोधित किया और प्रत्येक उपयोगकर्ता को UserDTO में परिवर्तित करने के लिए मानचित्र फ़ंक्शन शामिल किया। 'StreamSupport.stream (userRepository.findAll (pks) .spliterator(), false) .map (UserDTO :: new) .collect ( संग्राहक.collectingAndThen (collect.toList(), सूची -> list.isEmpty()? नया ResponseEntity <> (HttpStatus.NOT_FOUND) : नया प्रतिसाद ENTITY <> (सूची, HttpStatus.OK)); ' –

1
ऐसा दिखाई देता है अपरिभाषित में त्रुटि दिखाता है

यह स्ट्रीम के आपके टर्मिनल ऑपरेशन पर निर्भर करता है, याद रखें कि एक स्ट्रीम केवल एक बार खाया जा सकता है।

  • क्या यह/सांख्यिकी संचालन द्वारा समूहबद्ध है? फिर आपको 0 गिनती या समूहों का खाली नक्शा मिलेगा।
  • यदि यह किसी सूची में एकत्र करता है तो यह एक खाली सूची है।
  • यदि यह उन तरीकों में से एक है जो Optional (जैसे findAny) लौटाते हैं तो आप वैकल्पिक की नल-जांच विधियों का उपयोग कर सकते हैं।
+0

लेकिन वह अवधारणा नहीं है जिसे वह स्ट्रीम और पास-थ्रू करने की तलाश में है, लेकिन कुछ साइड-लॉजिक करते हैं जब कुछ वास्तव में गुज़रता है? तो स्ट्रीमिंग या उपभोग करने की अवधारणा को तोड़ना नहीं ... –

5

यह आवश्यक नहीं है, और अक्सर एक गलती है, सब कुछ एक पंक्ति में घूमने के लिए। इस मामले में, आप नहीं कर सकते - आपके इरादे के लिए ऐसा कोई एपीआई नहीं है।

इसे आसान बनाएं:

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)); 
+0

वह एक सामान्य समस्या का सरलीकृत संस्करण पूछ रहा है। यदि स्ट्रीमिंग को संग्रहित करने वाले संग्रह पर फ़िल्टरिंग लागू की गई थी तो यह स्पष्ट नहीं होगा कि यह खाली है या नहीं। –

संबंधित मुद्दे