使用返回 Future 的函数映射 Stream

2024-04-04

有时我发现自己处于这样的境地:Stream[X], and a function X => Future Y,我想组合成一个Future[Stream[Y]],而且我似乎找不到办法做到这一点。例如,我有

val x = (1 until 10).toStream
def toFutureString(value : Integer) = Future(value toString)

val result : Future[Stream[String]] = ???

I tried

 val result = Future.Traverse(x, toFutureString)

它给出了正确的结果,但似乎在返回 Future 之前消耗了整个流,这或多或少地破坏了目的

I tried

val result = x.flatMap(toFutureString)

但这不能编译type mismatch; found : scala.concurrent.Future[String] required: scala.collection.GenTraversableOnce[?]

val result = x.map(toFutureString)

返回有点奇怪和无用的Stream[Future[String]]

我应该在这里做什么来解决问题?

编辑:我没有陷入困境Stream,我对在Iterator,只要在开始处理头部之前它不会阻止评估所有项目

Edit2:我不是 100% 确定 Future.Traverse 构造需要在返回 Future[Stream] 之前遍历整个流,但我认为确实如此。如果没有,这本身就是一个很好的答案。

Edit3:我也不需要结果按顺序排列,我对返回的流或迭代器的顺序很满意。


你走在正确的轨道上traverse,但不幸的是,在这种情况下,标准库的定义似乎有点被破坏——它不需要在返回之前消耗流。

Future.traverse是一个更通用函数的特定版本,适用于包装在“可遍历”类型中的任何应用函子(请参阅these http://www.cs.ox.ac.uk/people/jeremy.gibbons/publications/#iterator papers http://www.soi.city.ac.uk/~ross/papers/Applicative.html或我的答案here https://stackoverflow.com/a/12358892/334519例如,了解更多信息)。

The Scalaz https://github.com/scalaz/scalaz库提供了这个更通用的版本,在这种情况下它按预期工作(请注意,我正在获取适用函子实例Future from scalaz-contrib https://github.com/typelevel/scalaz-contrib;它还没有出现在 Scalaz 的稳定版本中,它仍然是针对 Scala 2.9.2 交叉构建的,而 Scala 2.9.2 没有这个Future):

import scala.concurrent._
import scalaz._, Scalaz._, scalaz.contrib.std._

import ExecutionContext.Implicits.global

def toFutureString(value: Int) = Future(value.toString)

val result: Future[Stream[String]] = Stream.from(0) traverse toFutureString

这会立即以无限流的形式返回,因此我们可以确定它不会首先被消耗。


作为脚注:如果你看来源 https://github.com/scala/scala/blob/v2.10.2/src/library/scala/concurrent/Future.scala#L577 for Future.traverse你会看到它的实现方式是foldLeft,这很方便,但对于流来说不是必需的或不合适的。

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

使用返回 Future 的函数映射 Stream 的相关文章

随机推荐

  • HTML 5 视频流 .ism 文件?

    我有一个带有媒体服务 4 0 的 IIS 7 0 服务器设置 我创建了一个非常简单的 html 5 页面 其中包含video以其source指向一个 ism文件 是否可以使用 html 5 中的 ism 文件的清单来播放视频 就像在 sil
  • WordPress 插件 WooCommerce,自定义支付网关设置未保存

    我正在为 WordPress 插件 WooCommerce 开发自定义支付网关 我似乎无法保存支付网关的设置 当我在字段中输入信息然后单击 保存 时 页面刷新 所有字段均为空白 我究竟做错了什么 这是我的代码
  • 将参数传递给mapDispatchToProps()

    我不能撒谎 我对 React Redux 有点困惑 我认为很多操作都需要参数 例如从商店中删除项目 但即使我仍在阅读如何以这种方式从组件分派来传递参数 现在大约 2 小时 我没有得到任何答案 我被尝试过this props dispatch
  • Python 和/或 C/C++ 中的高精度算术?

    摘要 哪个 Python 包或 C 库是非常高精度算术运算的最佳选择 我有一些转换小数天数的函数 0 0 0 99999 转换为人类可读的格式 小时 分钟 秒 但更重要的是 毫秒 微秒 纳秒 转换是通过以下函数完成的 请注意 我还没有实施时
  • .Net DataView 和 DataTable 绑定

    我有一个简单的 Windows 窗体应用程序 它将 DataView 绑定到 ListBox 此 DataView 使用 Linq 按特定列降序对我的 DataTable 进行排序 然后我的列表框绑定到数据视图 然后我有一个简单的表单来将数
  • 每次发布后我应该关闭通道/连接吗?

    我在 Node js 中使用 amqplib 但我不清楚代码中的最佳实践 基本上 我当前的代码调用amqp connect 当 Node 服务器启动时 然后为每个生产者和每个消费者使用不同的通道 而不会真正关闭它们中的任何一个 我想知道这是
  • 在 dplyr 中过滤字符串列上的多个值

    我有一个data frame其中一列中包含字符数据 我想过滤多个选项data frame来自同一列 有没有一种简单的方法可以做到我所缺少的 Example data frame name dat days name 88 Lynn 11 T
  • 如何创建案例类的随机实例?

    假设我有几个案例类 例如 case class C c1 Int c2 Double c3 Option String case class B b Int cs Seq C case class A a String bs Seq B 现
  • 在线算法和离线算法有什么区别?

    这些术语在我的数据结构教科书中使用过 但解释非常简洁且不清楚 我认为这与算法在每个计算阶段拥有多少知识有关 请不要链接到维基百科页面 我已经阅读过它 并且仍在寻找澄清 像我十二岁一样的解释和 或示例会更有帮助 维基百科 维基百科页面非常清楚
  • 进程本地覆盖名称解析?

    我有测试代码 我希望在测试时将几个主机名解析为环回 部署后 此代码将根据需要使用正常的系统名称解析 测试和部署主机是最新的 Linux 发行版 例如 SLES11SP1 我想覆盖单个进程的主机名解析 而不是超级用户 有没有办法操纵nsswi
  • Django - 收到来自外部站点的流请求

    如何使用 Django 从用户请求触发的外部 API 获取数据 并将其直接流回请求周期而不使用 或渐进 最小 内存使用 背景 作为连接外部托管微服务的短期解决方案 需要限制用户对未经身份验证的 API 的访问 基于 Django 应用程序的
  • 如何从 ggplot2 包中仅绘制 geom_point 中的一系列值?

    Hello All I have the following molten data X variable value 1 StationA SAR11 cluster 0 001309292 2 StationB SAR11 cluste
  • 登录后保持会话 - selenium - javascript

    我正在尝试使用 selenium web driver 和 Node js 自动化几个页面 我能够登录 但登录后我想使用由网络驱动程序启动的相同会话 以便我可以在会话受保护的页面上进行自动测试 这是我的尝试 async function l
  • 如何将报表设计器标尺单位从英寸更改为厘米?

    一个简单的 我希望 问题 我正在使用 Visual Studio 我在 SQL Server Business Intelligence Development Studio 中创建一个新报告 在布局视图中 标尺的单位是英寸 我想将其更改为
  • Python函数返回字典?

    我是一名 Python 初学者 我遇到了一个我不理解的函数的输出 我无法提供所有代码 因为其中一些是我公司的 IP 我基本上使用我们的一位开发人员编写的库从数据仓库中提取指标 然后我想在另一个应用程序中使用这个指标值 当我获得该值时 我会将
  • 如何在 Gradle 中遮蔽传递依赖?

    有没有办法在 Gradle 中隐藏特定的 传递 依赖项 我的情况 我有一个项目直接依赖com amazonaws aws java sdk emr 1 10 33 and org apache hadoop hadoop aws 2 7 1
  • 如何使用 Scala Stream 类读取大型 CSV 文件?

    如何使用 Scala Stream 读取大型 CSV 文件 gt 1 Gb 你有代码示例吗 或者您会使用不同的方式来读取大型 CSV 文件而不先将其加载到内存中吗 只需使用Source fromFile getLines正如你已经说过的 这
  • 为什么我无法手动提交此表单?

    我试图在提交表单之前完成一些事情 以下代码运行没有错误 但我的表单从未提交 我不知道出了什么问题
  • 在Azure函数中设置cors标头

    在我的 Azure 函数中 我尝试设置 cors 标头 var response req CreateResponse HttpStatusCode OK response Content new ObjectContent
  • 使用返回 Future 的函数映射 Stream

    有时我发现自己处于这样的境地 Stream X and a function X gt Future Y 我想组合成一个Future Stream Y 而且我似乎找不到办法做到这一点 例如 我有 val x 1 until 10 toStr