是否可以在 Scala 中使用具有名称和命名参数值的 Map[String,Any] ?

2024-04-03

我正在为 REST Web 服务编写一个包装器,并且希望拥有强类型的 Scala API。

以下是我到目前为止正在做的事情:

def getMentions(count: Option[Int] = None,
                sinceID: Option[TweetID] = None,
                maxID: Option[TweetID] = None,
                trimUser: Option[Boolean] = None,
                contributorDetails: Option[Boolean] = None,
                includeEntities: Option[Boolean] = None) : List[Tweet] = {
val parameters = Map("count" -> count,
                     "since_id" -> sinceID,
                     "max_id" -> maxID,
                     "trim_user" -> trimUser,
                     "contributor_details" -> contributorDetails,
                     "include_entities" -> includeEntities)
/* 
 * Convert parameters, which is a Map[String,Any] to a Map[String,String]
 * (Removing Nones) and pass it to an object in charge of generating the request.
 */
...
}

这种方法是有效的,但它需要我手动生成parameters地图。 如果我能够访问表示参数及其值的 Map,我所做的事情将会更加清晰。


你可以通过运行时反射来做到这一点,我相信你会得到答案告诉你如何做,如果你想要的话,但这实际上是一个巧妙的用例Scala 2.10 的宏 http://scalamacros.org/,所以就这样。首先假设我们有一个名为ParamMapMaker.scala:

object ParamMapMaker {
  def paramMap: Map[String, Any] = macro paramMapImpl

  def paramMapImpl(c: scala.reflect.macros.Context) = {
    import c.universe._

    val params = c.enclosingMethod match {
      case DefDef(_, _, _, ps :: Nil, _, _) =>
        ps.map(p =>
          reify((
            c.Expr[String](Literal(Constant(p.name.decoded))).splice,
            c.Expr[Any](Ident(p.symbol)).splice
          )).tree
        )
      case _ => c.abort(c.enclosingPosition, "Can't call paramMap here!")
    }

    c.Expr[Map[String, Any]](Apply(Select(Ident("Map"), "apply"), params))
  }
}

我将把地图键的蛇形外壳作为读者的(简单)练习。

我们还有一个测试文件(名为Test.scala):

object Test extends App {
  def foo(hello: String, answer: Int) = ParamMapMaker.paramMap

  println(foo("world", 42))
}

现在我们编译这两个:

scalac -language:experimental.macros ParamMapMaker.scala
scalac Test.scala

当我们跑步时Test我们会得到以下结果:

Map(hello -> world, answer -> 42)

这样做的妙处在于,没有运行时反射的开销。如果我们编译测试文件-Ymacro-debug-verbose,我们看到以下代码已经为主体生成(实际上)foo在编译时:

Map.apply[String, Any](
  scala.Tuple2.apply[String, String]("hello", hello),
  scala.Tuple2.apply[String, Int]("answer", answer)
)

正如我们所期望的那样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在 Scala 中使用具有名称和命名参数值的 Map[String,Any] ? 的相关文章

  • Spark:出现心跳错误后丢失数据

    我有一个在 Spark 集群上运行的 Python 程序 有四个工作线程 它处理一个包含大约 1500 万条记录的巨大 Oracle 表 检查结果后发现大约有600万条记录没有插入 我的写入功能如下 df write format jdbc
  • Scala 中抛出异常,什么是“官方规则”

    我正在 Coursera 上学习 Scala 课程 我也开始阅读 Odersky 的 Scala 书 我经常听到的是 在函数式语言中抛出异常不是一个好主意 因为它破坏了控制流 并且我们通常返回一个失败或成功的 Either Scala 2
  • 以编程方式启动 Scala REPL?

    我想从命令行启动 Scala Swing 应用程序 然后在应用程序启动后 放入 Scala REPL 中以用作控制界面 理想情况下 我还想预先绑定一些变量名称 更好的是使用 REPL 的 Java2D 终端模拟器 但我找不到任何合适的东西
  • 如何将模型结果保存到文本文件?

    我正在尝试将从模型生成的频繁项集保存到文本文件中 该代码是 Spark ML 库中 FPGrowth 示例的示例 Using saveAsTextFile直接在模型上写入 RDD 位置而不是实际值 import org apache spa
  • 如何在 Apache Spark 中通过 DStream 使用特征提取

    我有通过 DStream 从 Kafka 到达的数据 我想进行特征提取以获得一些关键词 我不想等待所有数据的到达 因为它是可能永远不会结束的连续流 所以我希望以块的形式执行提取 如果准确性会受到一点影响 对我来说并不重要 到目前为止 我整理
  • 具有两个通用参数的上下文边界

    在 Scala 中 我可以使用上下文边界 def sort T Ordered t Seq T 与以下意思相同 def sort T t Seq T implicit def Ordered T 如果我有一个带有两个泛型参数的类怎么办 IE
  • HashPartitioner 是如何工作的?

    我阅读了文档HashPartitioner http spark apache org docs 1 3 1 api java index html org apache spark HashPartitioner html 不幸的是 除了
  • 模拟 BlazeClientBuilder[IO] 以返回模拟客户端[IO]

    我正在使用BlazeClientBuilder IO resource方法得到Client IO 现在 我想模拟客户端进行单元测试 但不知道该怎么做 有没有一个好的方法来嘲笑这个 我会怎么做 class ExternalCall val r
  • Spark SQL 失败,因为“常量池已超过 JVM 限制 0xFFFF”

    我在 EMR 4 6 0 Spark 1 6 1 上运行此代码 val sqlContext SQLContext getOrCreate sc val inputRDD sqlContext read json input try inp
  • 可选择将项目添加到 Scala 映射

    我正在寻找这个问题的惯用解决方案 我正在构建一个valScala 不可变 Map 并希望有选择地添加一项或多项 val aMap Map key1 gt value1 key2 gt value2 if condition key3 gt
  • 规范化且不可变的数据模型

    Haskell如何解决 规范化不可变数据结构 问题 例如 让我们考虑一个表示前女友 男友的数据结构 data Man Man name String exes Woman data Woman Woman name String exes
  • Spark:如何使用crossJoin

    我有两个数据框 df1有 100000 行并且df2有 10000 行 我想创建一个df3这是两者的交叉连接 val df3 df1 crossJoin df2 这将产生 10 亿行 尝试在本地运行它 但似乎需要很长时间 您认为本地可以实现
  • 使用 Scala 获取 Spark 数据集中最新时间戳对应的行

    我对 Spark 和 Scala 比较陌生 我有一个具有以下格式的数据框 Col1 Col2 Col3 Col 4 Col 5 Col TS Col 7 1234 AAAA 1111 afsdf ewqre 1970 01 01 00 00
  • Java 8 Stream,获取头部和尾部

    Java 8 引入了Stream http download java net jdk8 docs api java util stream Stream html类似于 Scala 的类Stream http www scala lang
  • 具有继承类型的 Aux 模式推理失败

    我有一个复杂的玩具算法 我希望纯粹在类型级别上表示 根据饮食要求选择当天菜肴的修改 对卷积表示歉意 但我认为我们需要每一层才能达到我想要使用的最终界面 我的代码有一个问题 如果我们表达一个类型约束Aux 模式生成的类型基于另一个泛型类型 它
  • 如何通过 javascript 和 ajax 调用 Scala 中的方法?

    我不知道我的标题是否有点误导 但这是我真正需要帮助的 我正在获取这个网址 get fb login fbEmail function data console log data 这是我的路线 GET fb login email prese
  • 获取SettingKey[T]的值

    我正在开发一个用于文档生成的插件 我想将所有生成的文件输出到我选择的目录中 该目录可以是SBT的子目录target目录 如下 val newTargetDirectory SettingKey File document target di
  • 将 Tuple2 的值部分(即映射)合并为按 Tuple2 的键分组的单个映射

    我在 Scala 和 Spark 中这样做 我有和Dataset of Tuple2 as Dataset String Map String String 下面是值的示例Dataset A 1 gt 100 2 gt 200 3 gt 1
  • Akka-Http 2.4.9 抛出 java.lang.NoClassDefFoundError: akka/actor/ActorRefFactory 异常

    我正在尝试使用 Akka http 构建一个简单的 Web 服务 我遵循了这个指南 http doc akka io docs akka 2 4 9 scala http low level server side api html htt
  • 正确使用术语 Monoid

    从下面的例子来看 我认为这样的说法是正确的String在串联运算下定义了一个幺半群 因为它是关联二元运算 并且String碰巧有一个身份元素 它是一个空字符串 scala gt Jane Doe Jane Doe res0 Boolean

随机推荐

  • Unity3D本地尺度问题

    下面的代码 Debug LogWarning updating scale fix scalefactor scaleFactor Current scale is cell transform localScale x cell tran
  • 运行时错误:CUDA 错误:设备端断言已触发 - 训练 LayoutLMV3 时

    我正在训练最新版本的layoutLMv3模型 但在开始训练时trainer train 出现以下错误 请帮我解决它 我使用的是 v100 4 GPU RuntimeError Traceback most recent call last
  • 选择所有选项值 php mysql

    我正在尝试从 MySQL 数据库中选择所有值 选项 a b 和 c 工作正常 但我不确定选择这三个选项的语法
  • 将复选框检查图像更改为自定义图像

    我正在尝试使用 CSS 更改复选框的默认 框图像 但它不起作用 有没有办法解决 class checkbox background url images button bullet normal png no repeat scroll 0
  • 在 iPhone 上管理 HTTP Cookie

    我想为 iPhone 移植一个使用 mechanize 的 python 应用程序 此应用程序需要登录网页并使用站点 cookie 转到该站点上的其他页面以获取一些数据 在我的 python 应用程序中 我使用 mechanize 进行自动
  • 为什么我可以在私有类型上使用 auto?

    我对以下代码的编译和运行感到惊讶 vc2012 gcc4 7 2 class Foo struct Bar int i public Bar Baz return Bar int main Foo f Foo Bar b f Baz err
  • 如何使用张量流服务使张量流集线器嵌入可服务?

    我正在尝试使用来自tensorflow hub的嵌入模块作为可服务 我是张量流新手 目前 我正在使用通用句子编码器 https tfhub dev google universal sentence encoder 1嵌入作为将句子转换为嵌
  • 单元测试模拟 - Node 17 + Typescript + ESM 模块

    有一个简单的问题我找不到答案 使用时 节点 17 打字稿 ESM package json 中的 类型 模块 我可以实现模拟吗仅用于一种功能 或模块 如果是这样 我可以举个例子吗 无论你使用什么框架 thanks 包 json test n
  • 如何暂时禁用 C/C++ 中的宏扩展?

    由于某种原因 我需要暂时禁用头文件和 undef MACRONAME将使代码编译 但它将在现有宏下进行 有没有办法禁用它 我应该提到 您并不真正知道宏的值 并且我正在寻找交叉编译器解决方案 至少应该在 GCC 和 MSVC 中工作 在 MS
  • PHP 中的缓存变量

    长话短说 我正在寻找快速有效地存储布尔变量的最佳方法 例如 当前用户是否浏览过此页面 布尔值 当前用户是否已为此页面投票 再次布尔 今天该用户有多少次通过投票获得积分 整数 这些变量将仅存储一天 即每天午夜它们将被删除 我可以想到五种方法来
  • SparkContext.getOrCreate() 用途

    目的是什么getOrCreate方法来自SparkContext班级 我不明白什么时候应该使用这个方法 如果我有 2 个 Spark 应用程序运行spark submit 在主要方法中 我用以下方法实例化 Spark 上下文SparkCon
  • 检查应用程序的互联网连接

    我需要检查用户是否已连接到互联网 然后才能继续 我使用 HttpClient 访问端点 如下所示 client http Client req http NewRequest GET url nil req SetBasicAuth use
  • Android 允许将多个文件上传(最大 150 MB)到 PHP 服务器

    我必须允许用户在从我的 Android 应用程序到 PHP 服务器的单个请求中上传多个文件 可以是图像 视频 音频 我正在使用 REST 网络服务 对于此功能 我使用以下代码 To upload the multiple documents
  • 没有为 Protobuf-net 中的 System.Management.Automation.PSObject 类型定义序列化程序

    这是我的课 ProtoContract internal class Powershellresults internal Powershellresults ProtoMember 1 public Collection
  • JAXB-@XmlMixed 用于读取@XmlValue 和@XmlElement

    我在这里看到了类似的问题 但它并没有帮助我解决问题 所以我在这里发布我的问题 看看是否有人可以修改我的代码以使其工作 问题 如何访问混合内容字符串值并将其保存在 setPhrase String value 方法中 标题 xml
  • 如何使用坐标数组获取最大/最小边界

    任何人都可以帮助我了解如何使用坐标数组获取最大 最小坐标的逻辑吗 我想要得到的是它可以从这些坐标数组中得到的最长距离 前任 var coordinates lat 231 lng 223l lat 43 lng 4323 lat 42312
  • NHibernate elt 字段

    有谁知道为什么 NHibernate 为多对多映射生成一个名为 elt 的 int 类型字段 我想知道为什么我需要它 谢谢 elt 字段是多对多映射中元素的外键 在连接表中 您应该看到两个外键列 id 对于父级 和 elt 对于元素 如果您
  • 如何对具有变化的值的数据帧进行一致的热编码?

    我正在获取数据帧形式的内容流 每个批次在列中具有不同的值 例如 一批可能如下所示 day1 data state MS OK VA NJ NM city C B G Z F age 27 19 63 40 93 另一个像 day2 data
  • 在设计选项卡中双击对象后删除 Netbeans 自动生成的代码

    所以我使用 Netbeans 和 设计 选项卡 放置标签 文本框等 很好 但是当您双击标签时 它会自动生成以下代码 private void jTextField1ActionPerformed java awt event ActionE
  • 是否可以在 Scala 中使用具有名称和命名参数值的 Map[String,Any] ?

    我正在为 REST Web 服务编写一个包装器 并且希望拥有强类型的 Scala API 以下是我到目前为止正在做的事情 def getMentions count Option Int None sinceID Option TweetI