gpt4 book ai didi

Java 8 将 Optional 转换为 long、int、String 或 Foo
转载 作者:行者123 更新时间:2023-11-29 08:25:02 26 4
gpt4 key购买 nike

我有这个函数,它返回一个对象,因为它不知道返回值是什么。它可以是 long、int、String 或 Foo

@SuppressWarnings("unchecked")
public Optional<Object> getRequestByFieldName(String fieldName) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class<?> classA = instanceA.getClass();

Method method = classA.getMethod("getAllFields");

Object o = method.invoke(instanceA);

// I'm using protobuf to get the field value,
// but a field could be missing because someone didn't send it
// in that case I return an Optional Empty object
Map<Descriptors.FieldDescriptor, Object> objectMap = (Map) o;

Object fieldValue = objectMap.entrySet().stream()
.filter(fieldDescriptorObjectEntry -> {
Descriptors.FieldDescriptor descriptor = fieldDescriptorObjectEntry.getKey();
return descriptor.getName().equals(fieldName);
})
.findFirst().map(fieldDescriptorObjectEntry -> fieldDescriptorObjectEntry.getValue())
.orElse(Optional.empty());

return Optional.of(fieldValue);
}

如何使用此函数将变量分配给 int、long 或 Foo?这是我目前拥有的:

long someUid = (long) getRequestByFieldName("some_uid").orElse(0);

但是,如果缺少该字段,我会不断收到此错误:

java.util.Optional cannot be cast to java.lang.Long

最佳答案

如果该字段不存在,您最终会分配 Optional.empty()fieldValue变量。

Object fieldValue =  objectMap.entrySet().stream()
.filter(fieldDescriptorObjectEntry -> {
Descriptors.FieldDescriptor descriptor = fieldDescriptorObjectEntry.getKey();
return descriptor.getName().equals(fieldName);
})
.findFirst().map(fieldDescriptorObjectEntry -> fieldDescriptorObjectEntry.getValue())
.orElse(Optional.empty()); // ISSUE HERE

然后返回 return Optional.of(fieldValue) .这意味着,当未找到任何字段时,您将返回一个 Optional<Optional<?>>。所以在执行以下操作时:

long someUid = (long) getRequestByFieldName("some_uid").orElse(0);

orElse bit 从未被调用,因为 Optional永远不会是空的。相反,它持有一个 Optional显然不能转换为 Long .从您的代码中,您应该能够简单地返回 map 的结果。 ,像这样:

return objectMap.entrySet().stream()
.filter(fieldDescriptorObjectEntry -> {
Descriptors.FieldDescriptor descriptor = fieldDescriptorObjectEntry.getKey();
return descriptor.getName().equals(fieldName);
})
.findFirst()
.map(fieldDescriptorObjectEntry -> fieldDescriptorObjectEntry.getValue());

这是否完全解决了转换问题取决于您如何确定 Optional 对象的类型持有。

关于Java 8 将 Optional<Object> 转换为 long、int、String 或 Foo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53951816/

26 4 0