当前位置: 首页 > 知识库问答 >
问题:

使用orElse clasue中的setter设置可选嵌套对象的默认值

皇甫高阳
2023-03-14

我想检查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)

这里出现的问题是,在这种情况下,是否可以将空类型强制转换为可选,以便类型相互兼容或以不同的方式设置默认名称。

共有1个答案

丁经略
2023-03-14

我注意到这里有几个问题。

  1. 您通过具有可选字段来滥用可选
  2. 您通过将其作为方法参数传递来滥用可选
  3. check AdapterNameOrSetDefaultValue听起来像是val方法。checkset都不意味着返回值。

撇开这些不谈,这里有一个简单的方法来实现它。

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,但无法正确设置该逻辑。如何确保特殊对象被反序列化到适当的类中,即使它们是嵌套的?