2015-03-09 14 views
6

Ho il seguente codice da un vecchio gruppo che utilizza guava Optional ed Enums (getIfPresent).Equivalente in java 8 di guava Enums.getIfPresent() che restituirà 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()); 

Come posso convertirlo in java 8? Qual è l'equivalente di guava Enums.getIfPresent in java 8 che restituirebbe un java.util.Optional?

risposta

2

Si può fingere con Java 8 come segue

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

Il metodo statico getValueOf occupa di IllegalArgumentException

+0

dispiaciuto per non essere chiaro .... ho cambiato il getName a getNameAsString() .... perché è in fase restituito come una stringa e voglio convertire un enum .... come il metodo di guava è fare (vedi le modifiche sopra) – JaJ

+0

fagioli freddi! grazie! – JaJ

+1

Quindi stai citando la parte della documentazione che dice chiaramente che il risultato non sarà mai nullo (dato che il metodo genererà un'eccezione per nomi errati) ma pensi ancora che provare a racchiudere il risultato tramite 'ofNullable' era una soluzione? – Holger

4

Un Stream modo più -idiomatic con alcuni farmaci generici spruzzato sul metodo firma:

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

Per testare:

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

uscita prevista:

false 
false 
true 
false 
1

ho voluto fare una versione leggermente più pulito di @ di iamiddy risposta, ma purtroppo non posso davvero messo in un commento, e non potrebbe essere OK per modificarlo risposta.

Questo esempio viene fatto per indicare che non vi è alcun vantaggio nell'avere un valore temporaneo che potrebbe essere nullo.

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