来自guava Enums.getIfPresent()的java 8中的等价物将返回java.util.Optional?

时间:2015-03-09 00:56:06

标签: java-8 guava 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中的guava Enums.getIfPresent,它将返回一个java.util.Optional?

3 个答案:

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