在Scala中同时打印和返回值的惯用方法

时间:2015-11-09 08:57:04

标签: scala

在Scala中打印(或做我需要做的任何事情)和返回值的惯用方法是什么?例如,

         A  B
0  value_0  4
1  value_0  5
2    value  6

我能想到的一种方法是使用隐式但我不喜欢自己修补标准库。

注意

在Ruby中,我们可以使用private void backhome(String error) { // TODO In a case of error this function return us to home page; Intent intent = new Intent(this, Home.class); intent.putExtra("error", error); startActivity(intent); youractivity.this.finish(); startActivity(intent); }

Seq(1,2,3)
  .map(_ * 2)
  .xxx(println) // Here I want to print the intermediate sequence
  .foldLeft(0)(_ + _)

2 个答案:

答案 0 :(得分:7)

Ruby中的

Object#tap基本上是K组合子的变体。我不相信Scala标准库中有一个实现,但很容易添加自己的实现:

implicit class TapExtension[T](o: => T) {
  def tap(f: T => Unit) = { f(o); o }
}

注意:这是一个隐式转换,猴子修补。

然后,您可以这样使用它:

Seq(1,2,3)
  .map(_ * 2)
  .tap(println)
  .foldLeft(0)(_ + _)

答案 1 :(得分:1)

完成此处是@jörg-w-mittag函数的一个版本,它不打印整个seq,而是打印每个元素。这也应该懒惰地工作:

implicit class IterableTapExtension[T[A] <: Iterable[A], A](o: T[A]) {
  def tap(f: A => Unit) = { o.map { v => f(v); v } }
}

Seq(1,2,3).map(_ * 2).tap(println).foldLeft(0)(_ + _)

(1 #:: 2 #:: 3 #:: Stream.empty).tap(println).take(2).toList