Java 8 在java 8中与guava Enums.getIfPresent()中的等效项相同,它将返回java.util.Optional?

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

我从一个使用guava Optional和Enum(getIfPresent)的旧组中获得了以下代码

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