在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)(_ + _)
答案 0 :(得分:7)
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