【问题标题】:Choosing non null attributes选择非空属性
【发布时间】:2021-06-29 08:53:46
【问题描述】:

我有一个具有 3 个属性的对象,其中只有一个不能为空。我想用不为空的参数调用方法,但如果可能的话,没有大的if else 语句。

我想过这样的事情,但它不起作用。

myMethode(myObj.getAttr1() || myObj.getAttr2() || myObj.getAttr3());

什么是好的解决方案?

【问题讨论】:

  • 如果您的对象的属性是如此相互关联,以至于它们中的一个且只有一个在任何时候都是非空的(一个不变的条件),那么您应该考虑添加一个getTheNonNullAttribute() 方法来您的对象(当然,适当命名)。
  • @k314159 我不能这样做,因为这些类是用 JAXB 生成的

标签: java


【解决方案1】:

一个选项是流式传输属性并过滤第一个(可能是唯一的)非空的:

myMethod(Stream.of(myObj.getAttr1(), myObj.getAttr2(), myObj.getAttr3())
               .filter(Objects::notNull)
               .findFirst()
               .orElse(null) // Or perhaps throw an exception?
        );

【讨论】:

  • getAttr1、getAttr2 和 getAttr3 都返回不同的类,比如 class1、class2 和 class3。有没有办法让 Stream 的返回值成为这些类之一而不是 Object?
  • @mxcx 流必须返回一些共同的父级,因为在编译时你不知道其中哪些会为空
【解决方案2】:

|| 是 逻辑或 运算符,只能在两种布尔类型之间使用,这就是您的代码不起作用的原因。

myMethode(myObj.getAttr1() != null ? myObj.getAttr1() : 
          myObj.getAttr2() != null ? myObj.getAttr2() : 
          myObj.getAttr3() != null ? myObj.getAttr3() : null);

【讨论】:

    【解决方案3】:

    如果你的对象只有 3 个属性,你可以像下面这样使用反射

    final long notNullAttributeCount = Arrays.stream(myObj.getClass().getFields())
            .map(f -> {
                try {
                    f.setAccessible(true);
                    return f.get(myObj);
                } catch (IllegalAccessException e) {
                    return null;
                }
            }).filter(Objects::nonNull).count();
    
    if (notNullAttributeCount == 1) {
        //do your staff
    }
    

    【讨论】:

      猜你喜欢
      • 2013-06-19
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 1970-01-01
      相关资源
      最近更新 更多