2016-07-08 2 views
4

In Java können Sie peek(x -> println(x)) auf einem Stream aufrufen, und es wird die Aktion für jedes Element ausführen und den ursprünglichen Stream zurückgeben, im Gegensatz zu Foreach, das Unit ist. Gibt es in Scala etwas Ähnliches, idealerweise etwas, das auf allen Monady-Typen funktioniert, so dass Sie das Original-Monad "passieren" können, während Sie eine Nebeneffekt-Aktion ausführen? (Logging, zum Beispiel)Gibt es so etwas wie die "Peek" -Operation von Java Stream in Scala?

Es ist natürlich leicht implementiert:

def tap[A, U](a: A)(action: (A) => U): A = { 
    action(a) 
    a 
} 

aber ich hoffe für etwas ein bisschen mehr elegant oder idiomatische.

+0

'stream.map {x => println (x); x} 'oder sonst' stream.foreach (println); stream' – Dima

+0

Der zweite würde nicht wie erwartet funktionieren, nehme ich an. – Det

+1

Siehe http://Stackoverflow.com/a/23231684/21755 –

Antwort

0

Eine Möglichkeit, dies zu lösen, ist mit implicits:

class Tappable[A](a: A) { 
    def tap[U](action: (A) => U): A = { 
    action(a) 
    a 
    } 
} 

implicit def any2Tappable[A](a: A): Tappable[A] = new Tappable[A](a) 

die dann nativ verwendet werden können:

connection.tap(_.connect()) match { 
    case c if c.getResponseCode == 304 => None 
    ... 

Alle anderen Antworten?

Verwandte Themen