Java 8 在java 8中与guava Enums.getIfPresent()中的等效项相同,它将返回java.util.Optional?
我从一个使用guava Optional和Enum(getIfPresent)的旧组中获得了以下代码Java 8 在java 8中与guava Enums.getIfPresent()中的等效项相同,它将返回java.util.Optional?,java-8,guava,optional,Java 8,Guava,Optional,我从一个使用guava Optional和Enum(getIfPresent)的旧组中获得了以下代码 //getNameAsString返回字符串文字,但我想安全地转换 //返回枚举并返回java.util.Optional。 //MessageName是一个枚举 可选的msgName=Enums.getIfPresent(MessageName.class,obj.getMessage().getnameastring()); 如何将其转换为java 8?java 8中的guava Enum
//getNameAsString返回字符串文字,但我想安全地转换
//返回枚举并返回java.util.Optional。
//MessageName是一个枚举
可选的msgName=Enums.getIfPresent(MessageName.class,obj.getMessage().getnameastring());
如何将其转换为java 8?java 8中的guava Enums.getIfPresent返回java.util.Optional的等价物是什么?您可以用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);
}
import java.util.Optional;
可选msgName=getValueOf(MessageName.class,obj.getMessage().getNameAsString());
公共静态可选getValueOf(类enumType,字符串名称){
MessageName枚举值=null;
尝试{enumValue=Enum.valueOf(enumType,name);
}捕获(IllegalArgumentException ex){
//把这个记录在这里
}
返回可选的.ofNullable(枚举值);
}
静态方法
getValueOf
处理IllegalArgumentException
一种更为流
的惯用方法,在方法签名上撒上一些泛型:
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();
}
预期产出:
false
false
true
false
我想对@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();
}
}
public静态可选getValueOf(类枚举类型,字符串名称){
试一试{
返回可选的.of(Enum.valueOf(enumType,name));
}捕获(IllegalArgumentException ex){
返回可选的.empty();
}
}
很抱歉不清楚……我将getName更改为getNameAsString()……因为它是作为字符串返回的,我想转换一个枚举……就像guava方法正在做的那样(请参见上面的编辑),所以您引用了文档中明确说明结果永远不会为null的部分
(因为该方法会对错误的名称抛出异常)但仍然认为尝试通过nullable的包装结果是一种解决方案吗?这是为了指出这一点,所以在实际代码中,您必须处理它,或者包装Enum.valueOf()在EnumWrapper中,捕获异常并返回null或Optionalhave编辑答案以处理IllegalArgumentException
false
false
true
false
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();
}
}