使用简写语法将缺失值传递到列表中的预期方法是什么
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
命令行开关。
一般来说,我非常喜欢使用 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
命令行开关。