我有一个使用guava Optional和Enums(getIfPresent)的旧组的以下代码。
// 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());
如何将其转换为java 8?什么是java 8中的guava Enums.getIfPresent,它将返回一个java.util.Optional?
答案 0 :(得分:6)
更加Stream
- 惯用的方法,在方法签名上撒上一些泛型:
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 :(得分:2)
您可以使用Java 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);
}
静态方法getValueOf
处理IllegalArgumentException
答案 2 :(得分:2)
我想对@ iamiddy的答案做一个稍微清晰的版本,但遗憾的是我无法将其置于评论中,编辑该答案可能不太合适。
这个例子指出,拥有一个可能为null的临时值没有任何好处。
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();
}
}