惯用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
)。但我必须标记这个问题,因为它相当主观。也许应该是一个更好的地方