【问题标题】:check if all fields in object are null with Option使用 Option 检查对象中的所有字段是否为空
【发布时间】:2021-03-29 08:55:58
【问题描述】:

我有一个带有多个字段的 java avro 对象。我想检查下一个条件:

  • 检查对象是否为空
  • 检查对象中的所有字段是否为空

你能帮我看看如何用 Option 来做吗?

我试过了:

val employee = // init instance

Option(employee).filterNot(e => e.getName == null && e.getLastNamme == null && e.getId == null && ...)



@AvroGenerated
public class Employee extends SpecificRecordBase implements SpecificRecord {
    public Integer id;

    public List<Department> properties;

    public String name;

    public String lastName;

    …..
}

【问题讨论】:

  • 那么,有什么问题?
  • 没有e.getName == null && ....
  • 如果你想检查getName是否为空,那么e.getName == null就是这样做的方法。

标签: scala avro option


【解决方案1】:

一般来说,如果你想检查某个东西是否是null== null(或者可能是eq null)将是最清晰的表达方式(并且执行效率最高)。

但是,一些 Scala 代码库(我曾与他们合作过......)具有禁止 null 的样式规则(并且团队的文化可能不愿意在这种情况下禁用 linter(例如 Java 互操作,例如这)null 否则将是非常合理的)。

对于这些,有几个选项(双关语?)需要考虑:

  1. 如果反对的是文字null,那么您可以使用None.orNull 绕过它:
Option(employee).filterNot { e =>
  e.getName == None.orNull
  // etc.
}

对于额外的被动攻击来指出荒谬的僵化:

val nul = None.orNull

Option(employee).filterNot { e =>
  e.getName == nul
}
  1. 如果其中任何一个没有通过审核,那么效率会更低,但更有可能满足教条式的“永远不应调用 null 的值”规则,您可以记住:
  • filterNot(pred) 通常可以替换为(特别是 Option,但其他具有空虚概念的单子) flatMap { a =&gt; if (pred(a)) None else Some(a) }
  • 如果xnull,则Option(x) 转到None
Option(employee).flatMap { e =>
  Option(e.getName).map(_ => e)
}.flatMap { e =>
  Option(e.getLastName).map(_ => e)
}  // etc.

如此多的开销和如此多的认知负担,但主导团队文化的开发人员可能会自欺欺人,认为他们正在编写 Haskell...

【讨论】:

    猜你喜欢
    • 2012-06-21
    • 2018-09-29
    • 2021-05-01
    • 2014-05-06
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多