我想检查Adapter类的值,它是Device类中的嵌套对象,如下所示:
@Setter
@Getter
public class Device {
private Optional<Socket> socket;
}
插座看起来像:
@Setter
@Getter
public class Socket {
private Optional<Adapter> adapter = Optional.empty();
}
适配器看起来像:
@Setter
@Getter
@AllArgsConstructor
public class Adapter {
public String name;
}
如果为空,则为字段名设置默认值。
我的方法如下:
public static Optional<Adapter> checkAdapterNameOrSetDefaultValue(Optional<Device> device) {
return device
.flatMap(Device::getSocket)
.ifPresent(d -> d.getAdapter().orElse(d.setAdapter(Optional.of(new Adapter("DDD")))));
}
看起来,它可以工作,但IntelliJ抱怨setter部分是无效的:
d.setAdapter(Optional.of(new Adapter("DDD")))
带有一条消息:
orElse Adapter in Optional cannot be applied to (void)
这里出现的问题是,在这种情况下,是否可以将空类型强制转换为可选,以便类型相互兼容或以不同的方式设置默认名称。
我注意到这里有几个问题。
可选
字段来滥用可选
。可选
。check AdapterNameOrSetDefaultValue
听起来像是val
方法。check
和set
都不意味着返回值。撇开这些不谈,这里有一个简单的方法来实现它。
public static void checkAdapterNameOrSetDefaultValue(Optional<Device> device) {
if (device.isPresent()) {
final Optional<Socket> optionalSocket = device.get().getSocket();
if (optionalSocket.isPresent()) {
final Socket socket = optionalSocket.get();
if (socket.getAdapter().isEmpty()) {
socket.setAdapter(Optional.of(new Adapter("DDD"));
}
}
}
}
一个奇特的版本是
device.flatMap(Device::getSocket).ifPresent(socket -> {
if (socket.getAdapter().isEmpty()) {
socket.setAdapter(Optional.of(new Adapter("DDD")));
}
});
是否可以将结果从高级版本包装到适配器类?
是的,但我不支持这样的事情。
public static Optional<Adapter> checkAdapterNameOrSetDefaultValue(Optional<Device> device) {
final Adapter defaultAdapter = new Adapter("DDD");
return Optional.of(device
.flatMap(Device::getSocket)
.map(d -> {
if (d.getAdapter().isEmpty()) {
d.setAdapter(Optional.of(defaultAdapter));
return defaultAdapter;
}
return d.getAdapter().get();
})
.orElseGet(() -> defaultAdapter));
}
问题内容: 有没有一种方法可以设置javascript对象的默认属性,例如: IE可以忽略,Chrome Frame减轻了我的头痛。 问题答案: 自从几年前我问这个问题以来,事情进展顺利。 代理是ES6的一部分。以下示例可在Chrome,Firefox,Safari和Edge中运行:
问题内容: 我有一个对象,它可以是任何数量的深度,并且可以具有任何现有属性。例如: 在此我想设置(或覆盖)属性,如下所示: 属性字符串可以具有任何深度,并且值可以是任何类型/事物。 如果属性键已经存在,则不需要合并对象和数组作为值。 前面的示例将产生以下对象: 如何实现这种功能? 问题答案: 此函数使用您指定的参数应添加/更新容器中的数据。请注意,您需要跟踪架构中的哪些元素是容器,哪些是值(字符串
对于我正在使用的插件,我必须具有如下状态: 如何在不设置其余访问权限的情况下设置hospital_id状态? 这似乎删除了一切,但hospital_id:
我有一个对象,可以是任何数量的层次深,可以有任何现有的属性。例如: 在此基础上,我希望设置(或覆盖)如下属性: 属性字符串可以有任何深度,值可以是任何类型/事物。 如果属性键已经存在,则不需要合并作为值的对象和数组。 上一个示例将生成以下对象: 如何实现这样的功能?
我只找到了未定义的变量的解决方案,而不是我目前拥有的用例。 我正在从另一个对象构建一个对象,在这个对象中,我从输入对象分配了一些值,例如。 在一些输入对象中,值被定义在一些不被定义的对象中。在这种情况下,我希望值和单位为空,然而这显然是错误的。 无法读取未定义的属性'0' 在本例中,观察值['obx.5'][0]尚未定义。 我可以尝试/捕捉,但是由于结果对象很长,这将变得非常不可读。 有什么方法可
这适用于顶级对象,但不适用于嵌套对象。例如,如果嵌套对象是特殊对象,则仍将其反序列化为公共对象。 我想做的是告诉Jackson:“无论嵌套级别如何,如果ObjType=Special,使用SpecialObject,否则使用GeneralObject”。我研究了多态反序列化,并尝试使用@JSONSubtypes,但无法正确设置该逻辑。如何确保特殊对象被反序列化到适当的类中,即使它们是嵌套的?