2015-06-09 1 views
20

परिवर्तित करने का अच्छा तरीका Optional<Integer> से Optional<Long> को परिवर्तित करने के लिए मैं एक स्वच्छ और कोड-कुशल तरीका खोजने का प्रयास कर रहा हूं। मैं जावा 7 में गुवा के साथ काम कर रहा हूं।वैकल्पिक <Integer> को वैकल्पिक <Long>

तो कोड में एक ही स्थान पर मैं एक वैकल्पिक पूर्णांक

बनाया है और एक अन्य क्षेत्र में मैं एक वैकल्पिक तक यह की जरूरत है। में सबसे अच्छी बात मैं के साथ आ सकता है यह है:

Optional<Long> optionalLong = optionalInt.transform(new Function<Integer, Long>() { 
     @Override 
     public Long apply(Integer inputInt) { 
      if (inputInt != null) 
       return inputInt.longValue(); 
      else 
       return null; 
     } 
    }); 

लेकिन यह बोझिल है, खासकर अगर आप समझते हैं कितना आसान है जब मैं आदिम प्रकार उपयोग कर रहा था प्रकार कास्ट करने के लिए किया गया था।

वहां कोई अच्छा विचार है?

+13

जावा 8 का उपयोग करें यह केवल 'वैकल्पिकInt.map (i -> (लंबा) i) है; ' –

+3

आपके फ़ंक्शन में, आपको' null': 'Optional.absent() के लिए परीक्षण करने की आवश्यकता नहीं है। ...) 'कुछ भी नहीं करता है। –

+8

@ पीटर Lawrey या 'वैकल्पिकInt.map (इंटीजर :: longValue)' – blgt

उत्तर

20

टी एल; डॉ: जावा 7, नंबर

में दुर्भाग्य से यह सबसे अच्छा जावा 7 कार्यों के लिए समर्थन के मामले में प्रस्ताव दिया है है।

मैं बस यही कहूंगा कि transformnull के साथ कभी नहीं बुलाया जाएगा ताकि आप कर सकते हैं:

Optional<Long> optionalLong = optionalInt.transform(new Function<Integer, Long>() { 
    @Override 
    public Long apply(Integer inputInt) { 
     return inputInt.longValue(); 
    } 
}); 

the documentation से:

तो उदाहरण मौजूद है, यह देखते हुए साथ तब्दील हो जाता है Function; अन्यथा, absent() वापस कर दिया गया है। यदि फ़ंक्शन null लौटाता है, तो NullPointerException फेंक दिया जाता है।

तो कभी नहीं वापसी null एक Function से transform को पारित कर दिया।

public enum IntToLong implements Function<Integer, Long> { 

    INSTANCE; 

    @Override 
    public Long apply(Integer input) { 
     return input.longValue(); 
    } 
} 

तब:

optionalInt.transform(IntToLong.INSTANCE); 

यह स्पष्ट रूप से होने की कीमत पर कॉल स्थल पर कोड को कम कर देता

आप इस एक बहुत पुनः उपयोग करते हैं, तो आप enum सिंगलटन पैटर्न इस्तेमाल कर सकते हैं कोड बेस में अतिरिक्त कक्षाएं - कुछ मैं इसके बारे में ज्यादा चिंतित नहीं होगा।

3

कलाकारों के करीब:

Optional<Long> optionalLong = Optional.fromNullable(optionalInt.isPresent() ? 
    optionalInt.get().longValue() : null); 

मूल रूप से इस को बदलने लागू की भूमि के ऊपर से बचा जाता है। आमंत्रण को सीधे प्रस्तुत करने के लिए मूल्य की जांच करने के लिए सरल बनाया जा सकता है।

+6

'= वैकल्पिकInt.isPresent() क्यों नहीं? वैकल्पिक। (वैकल्पिकInt.get()। LongValue()): वैकल्पिक .absent() '। यह 'शून्य' से बचाता है - जो वास्तव में 'वैकल्पिक' करना है। मुझे यकीन नहीं है कि "ओवरहेड" यहां सही शब्द है - शायद "जटिलता"। –

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