2015-03-09 6 views
6

मेरे पास पुराने समूह से निम्न कोड है जो अमरूद वैकल्पिक और Enums (getIfPresent) का उपयोग कर रहा है।अमरूद में जावा 8 में समतुल्य Enums.getIfPresent() जो java.util.Optional वापस करेगा?

// getNameAsString returns the string literal but I want to safely convert 
// to an enum and return an java.util.Optional <MessageName>. 
// MessageName is an enum 
Optional<MessageName> msgName = Enums.getIfPresent(MessageName.class, obj.getMessage().getNameAsString()); 

मैं इसे जावा 8 में कैसे परिवर्तित कर सकता हूं? जावा 8 में अमरूद Enums.getIfPresent के समतुल्य क्या है जो एक java.util.Optional वापस करेगा?

उत्तर

2

आप कर सकते हैं नकली यह जावा 8 के साथ के रूप में इस प्रकार है

import java.util.Optional; 
Optional<MessageName> msgName = getValueOf(MessageName.class,obj.getMessage().getNameAsString()); 

public static Optional<MessageName> getValueOf(Class<MessageName> enumType, String name){ 
      MessageName enumValue = null; 
        try{enumValue =Enum.valueOf(enumType, name); 
         }catch(IllegalArgumentException ex){ 
          //log this here 
         } 
      return Optional.ofNullable(enumValue); 
     } 

स्थिर विधि IllegalArgumentException

+0

स्पष्ट नहीं होने के लिए माफी चाहता .... मैं getNameAsString() के लिए getName बदल .... क्योंकि यह एक स्ट्रिंग के रूप में वापस आ जा रहा है और मैं एक enum कनवर्ट करना चाहते हैं .... जैसे अमरूद विधि है कर रहे हैं (उपरोक्त संपादन देखें) – JaJ

+0

शांत सेम! धन्यवाद! – JaJ

+1

तो आप दस्तावेज़ीकरण के उस हिस्से को उद्धृत कर रहे हैं जो स्पष्ट रूप से कहता है कि नतीजा कभी भी 'शून्य' नहीं होगा (क्योंकि विधि गलत नामों के लिए अपवाद फेंक देगी) लेकिन फिर भी लगता है कि 'नलबल' के माध्यम से परिणाम लपेटने का प्रयास समाधान था? – Holger

4

एक और अधिक Stream -idiomatic कुछ विधि हस्ताक्षर पर छिड़का जेनरिक के साथ जिस तरह से साथ getValueOf सौदों:

public static <T extends Enum<T>> Optional<T> valueOf(Class<T> clazz, String name) { 
    return EnumSet.allOf(clazz).stream().filter(v -> v.name().equals(name)) 
        .findAny(); 
} 

परीक्षण करने के लिए:

enum Test { 
    A; 
} 

public static void main(String[] args) { 
    Stream.of(null, "", "A", "Z").map(v -> valueOf(Test.class, v)) 
      .forEach(v -> System.out.println(v.isPresent())); 
} 

अपेक्षित उत्पादन:

false 
false 
true 
false 
1

मैं @ iamiddy के जवाब का एक थोड़ा क्लीनर संस्करण बनाना चाहते थे, लेकिन दुर्भाग्य से मैं सच में एक टिप्पणी में यह नहीं डाल सकते हैं, और इसे संपादित करने की कोई बात नहीं हो सकता है जवाब।

यह उदाहरण यह इंगित करने के लिए किया गया है कि अस्थायी मूल्य होने में कोई लाभ नहीं है जो शून्य हो सकता है।

public static <T extends Enum<T>> Optional<T> getValueOf(Class<T> enumType, String name) { 
    try { 
     return Optional.of(Enum.valueOf(enumType, name)); 
    } catch(IllegalArgumentException ex) { 
     return Optional.empty(); 
    } 
} 
संबंधित मुद्दे