2016-07-08 3 views
4

Java에서는 스트림에서 peek(x -> println(x))으로 전화를 걸면 각 요소에 대한 작업을 수행하고 foreach와는 달리 Unit이라는 원래 스트림을 반환합니다. 스칼라와 비슷한 무언가가 있습니까? 모든 Monady 유형에 이상적으로 작용하여 부작용을 수행하면서 원본 Monad를 "통과"할 수 있습니까?Scala에서 Java Stream의 "peek"연산과 같은 것이 있습니까?

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

그러나 나는 좀 더 우아한 또는 관용적 뭔가를 바라고 있어요 : (로깅, 예를 들면)

그것은 물론입니다 쉽게 구현했습니다. 다음 기본적으로

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) 

을 사용할 수 있습니다 :

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

다른 답변이 문제를 해결하기 위해

+0

'stream.map {x => println (x); x}'그렇지 않으면'stream.foreach (println); stream' – Dima

+0

두 번째 것은 예상대로 작동하지 않습니다. – Det

+1

http://stackoverflow.com/a/23231684/21755 –

답변

0

한 가지 방법은 implicits를 사용?