惯用Scala:带有值类型选项的映射

惯用Scala:带有值类型选项的映射,scala,Scala,我有一堆实体,我在地图中存储它们的值。我知道其中有些没有价值 通过使用Map[Entity,Option[Value]]将其显式化是一种好的做法,还是说Map本身已经有了这些语义?Map有get方法,该方法已经返回了选项,所以这确实是不必要的,并混淆映射的类型参数。映射有get方法,该方法已经返回一个选项,因此这确实是不必要的,并混淆映射的类型参数。只需使用map[键,值] Map[Key,Option[Value]是一种过度杀伤力 对于第二种情况Map(“key”->None)。您不想保留值为

我有一堆实体,我在地图中存储它们的值。我知道其中有些没有价值


通过使用
Map[Entity,Option[Value]]
将其显式化是一种好的做法,还是说
Map
本身已经有了这些语义?

Map有
get
方法,该方法已经返回了
选项,所以这确实是不必要的,并混淆映射的类型参数。

映射有
get
方法,该方法已经返回一个
选项
,因此这确实是不必要的,并混淆映射的类型参数。

只需使用
map[键,值]

Map[Key,Option[Value]
是一种过度杀伤力


对于第二种情况
Map(“key”->None)
。您不想保留值为none的键,只需使用
Map[Key,value]

Map[Key,Option[Value]
是一种过度杀伤力


对于第二种情况
Map(“key”->None)
。您不希望保留值为none的键,这取决于用例。您可能需要也可能不需要能够区分“无价值”和“无关键”场景。例如,想象一下用户的名字和中间名之间的映射。 如果键存在,但值为
None
,则表示用户没有中间名。如果密钥不存在,则您没有该用户的记录


另一方面,假设您将年份号映射到2月29日所在的一周中的某一天。在这种情况下,非闰年根本不需要出现在地图中,您可以假设,如果键不存在,那是因为没有与之关联的值。

这取决于用例。您可能需要也可能不需要能够区分“无价值”和“无关键”场景。例如,想象一下用户的名字和中间名之间的映射。 如果键存在,但值为
None
,则表示用户没有中间名。如果密钥不存在,则您没有该用户的记录


另一方面,假设您将年份号映射到2月29日所在的一周中的某一天。在这种情况下,非闰年根本不需要出现在地图上,您可以假设,如果一个键不存在,那是因为没有与之相关的值。

从语义上讲,这两种解决方案是不等价的。如果需要知道存在哪些实体(基于键集),则需要使用解决方案。然而,我仍然会使用第二种方法(使用一个简单的
Map
)并在另一个地方管理所有实体的集合。
映射
然后定义了一个
实体
和它的
之间的映射,如果没有映射,那么首先就没有理由添加
实体
作为键。我个人认为使用选项作为值没有什么意义(即使您需要处理默认情况,也可以使用
和defaultvalue
)。但我必须标记这个问题,因为这是一个相当主观的问题。也许应该是一个更好的位置。从语义上讲,这两种解决方案并不等价。如果您需要知道存在哪些实体(基于键集),然后您需要使用您的解决方案。但是,我仍然会使用第二种方法(使用简单的
映射
)然后,
映射
定义了一个
实体
与其
之间的映射,如果没有映射,那么就没有理由首先将
实体
添加为键。我个人认为使用选项作为值没有什么意义(即使您需要处理默认情况,也可以使用
和defaultvalue
)。但我必须标记这个问题,因为它相当主观。也许应该是一个更好的地方