Akka Streams - 如何生成List的大小,后跟整个List

时间:2017-12-03 17:02:51

标签: akka-stream

我想使用一个元素列表,然后转发列表的大小,然后是完整的元素列表。

E.g。

Given List (1, 2, 3, 4, 5) 
When the source is fully consumed
Then the next processing-stage receives the elements List(5, 1, 2, 3, 4, 5)

这是我试图解决的玩具问题;我感谢在下一个处理阶段收到第一个元素之前完全使用列表是不好的做法。

我有代码来计算列表的大小。

val length: RunnableGraph[Future[Int]] = FileIO.fromPath(Paths.get("myList.txt")).toMat(Sink.fold(0) {
    case (length, s) => length + s.length
})(Keep.right)

在将列表发送到下一个处理阶段(前面是列表大小)之前,我不确定如何完全使用列表。

1 个答案:

答案 0 :(得分:1)

您可以使用fold累积ListList元素本身的大小,然后使用flatMapConcatconcat

val data = List(1, 2, 3, 4, 5)

Source(data)
  .fold((0, List.empty[Int]))((acc, curr) => (acc._1 + 1, acc._2 :+ curr))
  .flatMapConcat {
    case (size, elems) => Source.single(size).concat(Source(elems))
  }
  .runForeach(println)

以上代码打印:

5 // size of the list
1
2
3
4
5

请注意,尽管上面的代码在这个玩具示例中起作用,但它不是“streamlike”,因为它将整个List复制到内存中(这取消了使用流的整个过程)。希望这个例子用于说明Akka Stream的一些功能,但不要在生产代码中遵循这种方法。