2015-03-09 7 views
6

Ich habe den folgenden Code aus einer alten Gruppe, die Guava Optional und Enums (getIfPresent) verwendet.Entspricht in Java 8 von Guava Enums.getIfPresent(), die java.util.Optional zurückgibt?

// 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()); 

Wie kann ich dies in Java 8 konvertieren? Was ist das Äquivalent von Guava Enums.getIfPresent in Java 8, das eine java.util.Optional zurückgeben würde?

Antwort

2

Sie fälschen kann es mit Java 8 wie folgt

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); 
     } 

Die statische Methode getValueOf beschäftigt sich mit IllegalArgumentException

+0

sorry für nicht klar zu sein .... Ich habe die getName zu getNameAsString() .... weil es als String zurückgegeben wird, und ich möchte eine ENUM konvertieren .... wie die Guave-Methode ist tun (siehe Bearbeitungen oben) – JaJ

+0

coole Bohnen! Danke! – JaJ

+1

Sie zitieren also den Teil der Dokumentation, der eindeutig besagt, dass das Ergebnis niemals "null" sein wird (da die Methode eine Ausnahme für falsche Namen auslöst), aber immer noch der Versuch, das Ergebnis über 'ofNullable' zu ​​verpacken, eine Lösung war? – Holger

4

A mehr Stream -idiomatic Weg mit einigen auf der Methodensignatur bestreut Generika:

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(); 
} 

Zum Testen:

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())); 
} 

Erwartete Ausgabe:

false 
false 
true 
false 
1

ich es eine etwas sauberere Version von @ iamiddy Antwort, aber leider machen wollte, ich kann nicht wirklich in einem Kommentar setzen, und es könnte nicht in Ordnung sein, das zu bearbeiten Antworten.

Dieses Beispiel soll verdeutlichen, dass es keinen Vorteil hat, einen temporären Wert zu haben, der null sein könnte.

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(); 
    } 
}