如何在控制台中打印源的值。
val someSource = Source.single(ByteString("SomeValue"))
我想从这个源中打印字符串“SomeValue”。我尝试了:
someSource.to(Sink.foreach(println)) //This one prints RunnableGraph object
someSource.map(each => {
val pqr = each.decodeString(ByteString.UTF_8)
print(pqr)
}) // THis one prints res3: soneSource.Repr[Unit] = Source(SourceShape(Map.out(169373838)))
如何打印最初用于创建单个对象的源的原始字符串。
1条答案
按热度按时间yyyllmsg1#
从问题中所写的内容来看,我认为您很可能正在使用Scala控制台或Scala工作表。
在Scala控制台或工作集中,它打印当前语句中创建的内容的表示。
但是,当你在这里使用
println
时,它还执行println,然后打印该println创建的值
u
实际上是一个Unit
。这可能就是您的困惑所在,因为
Sink.foreach
中的println
在本例中不起作用。这是因为这种情况更像下面的情况,即您实际上是在定义一个函数。
这里没有使用
println
,只是定义了一个将使用println
的函数(String => Unit
或Function1[String, Unit]
的示例)。因此,控制台只输出这里创建的值
f1
的类型为String => Unit
。您将需要调用此函数来实际执行
println
,类似地,
someSource.to(Sink.foreach(println))
将创建一个RunnableGraph
类型的值,因此scala控制台将打印类似于val res0: RunnableGraph...
的内容。现在,您需要运行此图以实际执行它。
但是与前面的函数示例相比,graph的执行是在线程池上异步发生的,这意味着它可能在Scala控制台或工作集的某些版本中不起作用(取决于线程池生命周期是如何管理的)。
如果它起作用,您将看到以下内容:
但您可能会看到一些错误,这些错误与控制台由于某些原因而无法完成图形运行有关。
实际上,你需要具体化
Sink
,它在运行图时会产生一个Future[Done]
,然后你需要等待使用Await
的Future[Done]
。您必须将所有这些内容放入一个普通的Scala文件中,并作为Scala应用程序执行。