番石榴 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();
}
}
我从一个使用 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();
}
}