使用简写语法将缺失值传递到列表中的预期方法是什么

What are the intended means for passing missing values into the list using short hand syntax

一般来说,我非常喜欢使用 List.of / Arrays.asList,但不幸的是他们不接受空值。我最常偶然发现的用例是在处理数据库调用时,参数被抽象为通过列表传递。因此,对于任何给定的过程,它始终必须具有一定的长度,并且可选值以空值形式给出。

我发现Why does Map.of not allow null keys and values?里面提到了List.of,但主要是说地图。对于地图,我同意——.get 的歧义似乎很麻烦(键丢失,或者值故意为空?),但这似乎不适用于列表。如果您从列表中得到一个 null,那么您肯定知道有人故意把它放在那里。

有些人可能会说“使用可选”,但我坚信它应该保留给 return 类型,其他人似乎同意 Uses for Optional

having an Optional in a class field or in a data structure, is considered a misuse of the API

预期的清洁标准溶液是什么?它真的可以归结为“在没有这些漂亮的 shorthand 语法的情况下使用样板式 ArrayList 初始化”或“编写您自己的 util 方法”吗?

Generally I've been quite a fan of using List.of / Arrays.asList, but unfortunately they don't accept nulls

这是不正确的:

List<String> list = Arrays.asList("a", "b", null);
String nullRef = list.get(2);
System.out.println(nullRef);

工作正常。 List.of 确实不接受 null refs.

Some people might say "use optional"

是的,忽略那些人。

What is the intended clean, standard solution?

清洁是一个狡猾的词,通常最好理解为:“我个人喜欢它,但我不愿意仅仅说这是一种口味偏好”——它没有任何意义。毕竟,你不能争论品味。

标准解决方案,即边界objective语言,我们可以使用它。

我认为您的 API 采用数据库值列表的设计是问题所在。据推测,您已经为此编写了自己的抽象层。

我很难想象数据库抽象 APIs 其中 'list of objects that includes null refs' 是正确的调用。

如果您正在尝试编织准备好的语句 'parameters',这似乎是一个不错的选择 API,并且根本不需要列表:

db.select()
  .append("SELECT a, b FROM c INNER JOIN d ON c.e = d.f ")
  .append("WHERE (signup IS NULL OR signup < ?) ", LocalDate.now())
  .append("AND LEFT(username, ?) = ?", 2, "AA")
  .query()

如果您尝试抽象一个 insert/merge/upsert 语句,您需要某种方法将值与该值作为值的列名链接起来。这会建议一个 API 沿线:

db.insert("tableName")
  .mergeOn("key", key)
  .mergeOn("date", someDate)
  .put("value", value)
  .exec();

您也可以为此目的重复使用 Map.of,在这种情况下,只需不在您的地图中包含 key/value 对即可完成 'I want the db to use the default value for this column',从而回避您对将 null 放入这样的地图中。

如果您展示您的特定 API 用例,或许可以提供更多见解。

如果您的问题归结为:

“我想放置 null 引用并使用 List.of,标准的干净方法是什么”

那么答案就很明显了:什么都没有——因为那是行不通的。

没有--shut-up-List.of--let-me-add-nulls命令行开关。