番石榴 Enums.getIfPresent() 中 java 8 中的等效项会 return java.util.Optional?

Equivalent in java 8 from guava Enums.getIfPresent() that will return java.util.Optional?

我从一个使用 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 中的番石榴 Enums.getIfPresent 相当于 return 和 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);
        }

静态方法getValueOf处理IllegalArgumentException

一种更 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

我想为@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();
    }
}