当前位置: 首页 > 知识库问答 >
问题:

处理Scala映射中缺少键和空值的优雅方式

农雅畅
2023-03-14

我理解

  • 在Scala中应该避免使用null
  • Map.get将返回一个Option[B],我可以使用. getOrElse获取值并回退到默认值

例如。

map.getOrElse("key1","default")

同时,我正在与一个Java库交互,其中一些值为null。

e、 g.地图(“键1”-

在这种情况下,getOrElse将抛出空指针。

我想处理这两个案件,并导致写这样的东西

  def getOrElseNoNull[A,B](map:Map[A,B],key:A,default:B) = {
    map.get(key) match{
      case Some(x) if x != null => x
      case _ => default
    }
  }

这很难看。(这是Map[任何],我需要该键的字符串)

getOrElseNoNull(map,"key1","").asInstanceOf[String])

是否可以使用隐式或任何其他优雅的方式来扩展贴图?

共有3个答案

盖锦程
2023-03-14

一种可能性是将值映射到Option()

val withoutNulls: Map[Int, Option[String]] = withNulls.mapValues(Option.apply)

这使您能够以相同的方式处理缺少的值和空值:

val nullsEqualMissing: Map[Int, Option[String]] = withoutNulls.withDefaultValue(None)
nullsEqualMissing(1).fold{ "nullOrMissing" }{ identity }

或单独处理缺失值:

withoutNulls.get(1).fold{ "missing" }{ _.fold{ "null" }{ identity }}
长孙逸仙
2023-03-14

隐式扩展类来拯救:

implicit class NullOccludingMap[K, V](private val underlying: Map[K, V]) extends AnyVal {
  def getNonNullOrElse(key: K, default: V): V = {
    underlying.get(key) match {
      case Some(value) if value != null => value
      case _ => default
    }
  }
}

然后,您可以在范围内的任何地方使用它:

val test = Map("x" -> "Hi", "y" -> null)
test.getNonNullOrElse("z", "") // ""
test.getNonNullOrElse("y", "") // ""
白彦
2023-03-14

如果您处理的是一个不可变映射,最安全的做法是预先过滤掉所有的空值(这会导致创建另一个映射实例,但除非您有特定的理由关心这里的性能,否则这不应该是一个问题)。

val withoutNulls = map.filter{case (k,v)=> v != null}

任何保留null的键都将消失,因此此键上的getOrElse将返回None。琐碎,一次完成任务。

 类似资料:
  • 我目前正在开发JavaFX中的计算器,现在正在尝试实现键盘输入支持。 为此,我试图在主. java文件中实现一个EventHandler,如下所示: FXMLDocumentController。java: 现在的问题是,每当按下这些键时,都会发生与我在GUI中单击相应按钮时相同的事情。 所有数字按钮共享一个onAction事件, ,-,/,* 也共享一个,等等。它们都使用FXMLDocument

  • 但这不是有效的语法。 我是否必须分别检查每一个密钥才能处理无的情况?

  • 假设我们有一个键-值映射的数据结构,其中键本身也是一个键-值映射。例如: 现在,假设我们要查询此映射中与键的某个键值子集匹配的所有顶级键/值。示例: 我们的查询是“给我所有key值,其中key包含,它将返回第一个和第三个值将返回所有同时具有和的键值,生成第二个值。显然,我们可以在每一个查询的完整地图中进行搜索,但我正在寻找比这更高效的方法。 我四处查看了一下,但是找不到一个高效、易用的C解决方案。

  • 本文向大家介绍Idea servlet映射方法优缺点对比,包括了Idea servlet映射方法优缺点对比的使用技巧和注意事项,需要的朋友参考一下 配置Servlet的方法有俩种,分别是传统web.xml文档中部署servlet和注解方式部署servlet,下面就先一起来学习下注解方式部署servlet 注解方式部署servlet: 首先在idea项目空间里创建一个class类 然后在类名后面接上

  • 问题内容: 我已经知道如何用辛苦的方式做到这一点,并使它起作用-遍历条目并“手动”交换。但是我想知道是否可以像许多任务一样以一种更优雅的方式解决这一问题。 我可以假设我的地图是双射的,顺便说一句:) 问题答案: 标准的API / Java运行时不提供双向映射,因此唯一的解决方案是遍历所有条目并手动交换它们。 您可以做的是创建一个包装器类,该包装器类包含两个映射,并且在内部进行双重处理,因此您可以快

  • 问题内容: 使用Hibernate,可以创建一个组合ID,其中要映射到该ID的列之一可以为空值吗? 这是为了处理具有唯一键的旧表,该键可以具有空值,但不能具有主键。 我意识到我可以只向表中添加一个新的主键列,但是我想知道是否有任何方法可以避免这样做。 问题答案: 否。主键不能为null。