【问题标题】:Source.combine doesn't take varargs?Source.combine 不接受可变参数?
【发布时间】:2020-12-14 22:38:41
【问题描述】:

Akka 是否试图传达 Source.combine 不应该与源集合一起使用?还是我对函数定义有点傻?

Akka Source.combine 在 vararags 之前需要第一个和第二个源。函数定义如下:

def combine[T, U](first: Source[T, _], second: Source[T, _], rest: Source[T, _]*)(
      strategy: Int => Graph[UniformFanInShape[T, U], NotUsed]

我想做一些类似的事情:

val sources : Seq[Source[Int,_]] = ???
Source.combine(sources:_*)(Merge(_))

我不知道我的sources 是否会有 1,2 或多个来源。所以写这些案例会增加几行。没什么大不了的,但我觉得我错过了一些东西。这是 akka 流的反模式吗?

【问题讨论】:

    标签: scala akka akka-stream


    【解决方案1】:

    first: Source[T, _], second: Source[T, _], rest: Source[T, _]* 模式的重点是确保您将至少 2 个(可能更多)源传递给方法。

    如果方法签名允许sources:_*,您可能会传递空可变参数或仅传递单个元素。

    在您的情况下,如果来源是 Seq,我将只对来源进行模式匹配以拆分为第一个和第二个元素以及其余元素:

    sources match {
       case first :: second :: rest => Source.combine(first, second, rest:_*)(Merge(_))
       case _ => ??? // too few elements, maybe return Source.failed?
    }
    

    【讨论】:

    • 我不知道为什么 Source.combine 不能像 Source.empty 一样返回空源,或者只是列表头部的副本。我认为您的解释和匹配案例是一个相当简洁的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 2016-05-29
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多