2017-12-21 119 views
5

दौरान flatMap में विधि संदर्भ में लैम्ब्डा बदलें हम एक Customer वर्ग है कहो।सरणी मानचित्रण

वर्तमान में मैं यह किसी भी तरह कर रहा हूँ इस तरह:

Collection<Customer> customers = ... 
customers.stream().flatMap(
     customer -> Arrays.stream(customer.getCars()) 
)... 

यह अच्छी तरह से काम करता है, लेकिन कोड नहीं लगती है सुरुचिपूर्ण। मैं वास्तव में इसे कोड के साथ प्रतिस्थापित करना चाहता हूं जो विधि संदर्भों का उपयोग करता है जो आमतौर पर अधिक पठनीय और अधिक कॉम्पैक्ट दिखता है। लेकिन सरणी प्रकार के एक क्षेत्र का उपयोग करना मुश्किल बनाता है।

प्रश्न:flatMap कॉल को बढ़ाने का कोई तरीका है तो यह अधिक पठनीय/कॉम्पैक्ट/स्पष्ट होगा? map और flatMap - -

+6

ठीक है आप 'ग्राहक.स्ट्रीम() मानचित्र (ग्राहक :: getCars) .flatMap (Arrays :: stream) 'कर सकते हैं, लेकिन आईएमओ आपका समाधान पठनीय और सुरुचिपूर्ण है। –

उत्तर

7

आप दो कॉल में flatMap कॉल विभाजित कर सकते हैं प्रत्येक एक विधि संदर्भ प्राप्त:

Collection<Customer> customers = ... 
customers.stream() 
     .map(Customer::getCars) 
     .flatMap(Arrays::stream)... 
3

आप इस्तेमाल कर सकते हैं:

.map(Customer::getCars) 
.flatMap(Arrays::stream) 

लेकिन मुझे नहीं लगता कि यह है किसी भी तरह से elegant। और इस तरह के तरीकों के संदर्भ के रूप में सबकुछ भी कम से कम मेरे लिए कम पठनीय बनाता है। मुझे खुद को समझा जाना चाहिए क्योंकि मैं इसे कम पढ़ने योग्य क्यों देखता हूं, क्योंकि इस कोड को पढ़ने के दौरान अब मुझे दो चरणों को समझने की आवश्यकता है। क्यों map किया जाता है और क्यों flatMap किया जाता है - हालांकि मामूली लग सकता है।

6

Customer पर Car एस की स्ट्रीम लौटने के लिए बस एक विधि जोड़ें। ठेठ नामकरण सम्मेलनों का उपयोग करना, यह

public Stream<Car> cars() { 
    return Arrays.stream(cars); 
} 

की तरह फिर विचार करेंगे, आप की तरह

customers.stream().flatMap(Customer::cars) 

आम तौर पर इसका इस्तेमाल कर सकते हैं, एक सरणी की तरह एक परिवर्तनशील प्रकार के गुणों देखभाल के साथ संभाला जाना चाहिए। गेटटर के माध्यम से संशोधन को रोकने का एकमात्र तरीका एक प्रतिलिपि बनाना है। तो Stream जैसे रीड-ओनली प्रकार को लौटने का एक वैकल्पिक तरीका प्रदान करना, जिसे प्रतिलिपि की आवश्यकता नहीं है, flatMap साफ करने के अलावा अतिरिक्त उपयोग हैं।

+5

इस दृष्टिकोण का अतिरिक्त लाभ है कि, अगर कारों की सरणी 'शून्य' है, तो आप इस मामले को विधि में भी संभाल सकते हैं: 'वापसी कार == शून्य? Stream.empty(): Arrays.stream (कारें); ' –

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