2017-12-21 130 views
6

मानचित्र के किसी मूल्य पर फ़ंक्शन निष्पादित कैसे कर सकता है, यदि यह मौजूद है, तो मानचित्र में कोई परिवर्तन किए बिना? मैं इसे 'जावा 8' घोषणात्मक शैली का उपयोग करके करना चाहता हूं, जो Optional.ifPresent() के बराबर है।मानचित्र ifPresent फ़ंक्शन

मेरे उपयोग के मामले इस प्रकार है:

मैं प्राप्त भाग में वस्तुओं के लिए अद्यतन (नई या हटाए गए), मैं अपने माता पिता के साथ इन अपडेट पंजीकृत करना चाहते हैं।

Map<ParentId, Parent> parents = ... 

एक नए बच्चे मैं क्या निम्नलिखित प्राप्त जब:

parents.computeIfAbsent(child.getParentId(), k -> new Parent()).addChild(child)); 
हालांकि मैं कथात्मक समारोह नहीं मिल सकता है दूर करने के लिए

बहीखाता के लिए मैं निम्नलिखित है। सीधे आगे मैं के रूप में इस लागू करना होगा:

if(parents.containsKey(child.getParentId()) 
{ 
    parents.get(child.getParentId()).removeChild(child); 
} 

या मैं एक Optional में मूल्य लपेट सकता है:

Optional.ofNullable(parents.get(child.getParentId()).ifPresent(p -> p.removeChild(child)); 

ध्यान दें कि जनक एक सरल सूची नहीं है, यह सिर्फ बच्चों की तुलना में अधिक होता है। तो निम्नलिखित काम नहीं करता है (क्योंकि removeChild() वापस नहीं करता है एक Parent):

parents.computeIfPresent(child.getParentId(), (k, v) -> v.removeChild()); 

मैं यह कैसे कर सकते हैं, या वहाँ Optional.ifPresent() करने के लिए कोई समकक्ष है?

+0

वे वैकल्पिक साथ जिस तरह से शायद सबसे आसान दृष्टिकोण और साफ मैं है – Lino

+0

के बारे में सोच सकते हैं क्या होता है जब माता-पिता किसी बच्चे के साथ समाप्त होता है? क्या आपको उस माता-पिता को मानचित्र से भी हटाने की ज़रूरत है, या यह ठीक है अगर माता-पिता के साथ कोई बच्चा नहीं रहता है? –

+0

@FedericoPeraltaSchaffner इस उदाहरण के लिए कुछ भी नहीं (मेरे मामले में, क्योंकि वहां भी अन्य डेटा है जिसे सहेजा जाना चाहिए)। – Thirler

उत्तर

5

मैं अपने Optional समाधान ठीक लग रहा है लगता है, लेकिन के लिए

निम्नलिखित काम नहीं करता है (क्योंकि removeChild() एक जनक वापस नहीं करता है): parents.computeIfPresent(child.getParentId(), (k, v) -> v.removeChild());

आप का विस्तार कर सकता है लैम्ब्डा

parents.computeIfPresent(child.getParentId(), (k, v) -> { v.removeChild(); return v; }); 

मैं कहूंगा कि इस मामले में सीधा-आगे रास्ता स्पष्ट है हालांकि, मैं उसके साथ जाऊंगा।

+2

यह ध्यान देने योग्य है कि यदि यह 'computeIfPresent' प्रभावी रूप से उपयोग नहीं करता है, तो मानचित्र को बदल नहीं सकता है, अपरिवर्तनीय मानचित्र इसे बिना किसी जांच के मूल्यांकन के बिना' असमर्थित ऑपरेशन अपवाद 'के साथ अस्वीकार कर सकते हैं या नहीं। – Holger

+0

@ होल्गर जो एक बहुत अच्छा मुद्दा है, केआईएसएस के लिए एक और कारण है। – daniu

1

एक अनावश्यक माता-पिता को बनाने के लिए कोई साइड इफेक्ट नहीं है, और कोई अपवाद नहीं एक अनुपस्थित बच्चे को निकाल कर फेंक दिया जाता है, तो आप इस्तेमाल कर सकते हैं:

parents.getOrDefault(child.getParentId(), new Parent()).removeChild(child); 
+0

@ लिनो, यह मानचित्र पर मूल्य जोड़ देगा यदि यह मौजूद नहीं था। – Thirler

+0

@ थिल्डर आप सही हैं – Lino

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