【问题标题】:How to map a source onto another?如何将源映射到另一个?
【发布时间】:2018-12-17 11:33:06
【问题描述】:

我有两个案例类

case class Color (name: String, shades: List[Shade] = List.empty)

case class Shade (shadeName: String)

我也有两个解析器:

object ColorParser {
    def apply(
    s: String): Either[List[SomethingElse], Color] = {
        val values = s.split("\\|", -1).map(_.trim).toList
        validateColor(values).leftMap(xs => xs.toList).toEither
    }
}

object ShadesParser {
    def apply(s: String)
    : Either[List[SomethingElse], Shade] = {
        val values = s.split('|').map(_.trim).toList
        validateShade(values).leftMap(xs => xs.toList).toEither
    }
}

我有Color 的来源和Shade 的来源。

  sourceForShade
  .via (framing("\n"))
  .map (_.utf8string)
  .map (_.trim)
  .map {
    s => ShadesParser(s)
  }
  .collect {
    case Right(shade) => shade
  }

  sourceForColor
  .via(framing("\n"))
  .map(_.utf8String)
  .map(_.trim)
  .map(s => ColorParser(s))
  .collect {
    case Right(color) => color
  }
  .map {color =>
       //Here I want access to Color object that has the property shades list property set based on sourceForShade. 
       //At the moment it only has the name field but the List[Shade] property is empty.
  }

问题

map 的 cmets 部分中,我如何才能访问也具有基于 sourceForShade 填充的 shades: List[Shade] 属性的颜色对象

【问题讨论】:

    标签: scala akka akka-stream


    【解决方案1】:

    一种方法是首先从第一个流中获取Future[Seq[Shade]],然后将该Future 的结果应用于第二个流:

    val shades: Future[Seq[Shade]] =
      sourceForShade
        .via(framing("\n"))
        .map(_.utf8String.trim)
        .map(ShadesParser)
        .collect {
          case Right(shade) => shade
        }
        .runWith(Sink.seq[Shade])
    
    val colors: Future[Source[Color, _]] =
      shades map { s =>
        sourceForColor
          .via(framing("\n"))
          .map(_.utf8String.trim)
          .map(ColorParser)
          .collect {
            case Right(color) => color
          }
          .map(c => c.copy(shades = s.toList))
      }
    
    val colorsWithShades: Source[Color, _] =
      Source.fromFuture(colors).flatMapConcat(identity)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 2021-09-20
    相关资源
    最近更新 更多