我有一个未来链,它获取一个资源,使用它来检索一些数据,然后修改该数据并返回结果(仍然在未来)。
我希望在返回未来链之前释放资源,但不必插入更接近的样板代码(即,将中间结果放入某个变量中,然后将其作为链其余部分的结果返回)。
我在找这样的东西:
.getResource() //returns future
.flatMap(resource => resource.getUsageResult()) //returns future
.FUNCTION_I_NEED(resource.free())
//executes for failures and successes, doesn't change propagated exceptions or values
.flatMap(usageResult => mutate(usageResult)) //returns future
您可能正在寻找和然后
-运算符:
something.getResource()
.flatMap(resource => resource.getUsageResult() andThen { case _ => resource.free() })
.flatMap(usageResult => mutate(usageResult))
你可以这样做:
getResource()
.flatMap(resource => {
resource.getUsageResult()
.map(result => {
// .map makes sure the usage result is done
// do your side effect here
yourSideEffectOn(resource)
// return the result again so you can do something with it
result
})
})
.flatMap(usageResult => mutate(usageResult))
你应该能够通过使用理解来简化它:
for {
resource <- getResource()
usageResult <- getUsageResult(resource)
} yield {
yourSideEffectOn(resource) // will not wait if it returns a future
mutate(usageResult)
}
如果我没记错的话,这也应该有效:
for {
resource <- getResource()
usageResult <- getUsageResult(resource)
_ = yourSideEffectOn(resource) // will not wait if it returns a future
} yield mutate(usageResult)
如果你想等待副作用也完成(如果它失败了,就中断),你也可以平面映射副作用:
for {
resource <- getResource()
usageResult <- getUsageResult(resource)
_ <- yourSideEffectOn(resource) // will wait for side effect to finish
} yield mutate(usageResult)
大概是这样的: 谢谢[已解决] 也感谢Umer Farooq的回答:从lambda内部修改局部变量
使用PHP-PDO和SQLite,我可以编写一个PDO调用来检查表中是否存在某一行(通过检查主键),如果不存在,则编写另一个PDO调用来创建该行。但我觉得应该可以在一个命令中实现……类似于“如果不存在,则创建表”。是否有类似“不存在时插入行”的内容?
如果一个中间操作消耗了流的一些元素,之后使用了peek(),但没有终端操作,那么peek()是否还应该产生一些输出呢?
所以我想要一个“Void Repository”,通过它可以访问不一定在实体上操作的存储过程。 但这当然不起作用,因为期望是一个实体。 有没有一种方法可以使用注释而无需创建虚拟实体,或者我是否坚持使用使用通过准备好的语句进行查询的已实现类? 因为老实说,这很难看:
问题内容: 关于将行旋转为各种数据库的列,有很多文章。他们似乎分为两个阵营,使用案例语句或使用数据库供应商的内置功能。我正在使用 MySQL ,到目前为止,尚未在任何内置函数上找到任何东西,该函数使我可以选择任意数量的行值(希望将其转换为列)。如果我不提前知道这些值,则无法构建经常出现在stackoverflow上的CASE查询。我想知道MySQL中是否有类似于其他数据库中称为交叉表或数据透视表的
我再次编写另一个银行系统插件,但这次是使用ATM。我正在尝试弄清楚如何在单击该选项后获得玩家聊天输入,以防止单击100次以在银行帐户上存入50,000美元。 我正在用Paper-Spigot 1.14.4编写这个插件,我尝试了以下步骤: 作为一个单独的类,仅当我向插件管理器注册事件时才激活: 使用 get 和 set-method创建一个 变量 ,并在需要时在该方法中调用它。 我当前的方法: 获取