[SCALA] 스칼라 mapValues 게으른인가?
SCALA스칼라 mapValues 게으른인가?
언제 전화
System.err.println("Before")
System.err.flush()
val foo: Map[Int, T] = t mapValues (fn(_))
System.err.println(foo.head) //prevent optimiser from delaying the construction of 'foo'
System.err.println("After")
System.err.flush()
FN은 디버그 인쇄 문 내부를 갖는,이 출력을 얻을 :
Before
...head item...
After
...debug print statement from fn...
...debug print statement from fn...
디버그 인쇄 문이 인쇄 된 "후"다음에 호출되는 이유를 이해하지 않으며, mapValues 게으른 맵을 작성하지 않는 한 나는 --- 두 번 받고 있어요 왜 이해가 안 돼요?
해결법
-
==============================
1.예 그렇습니다. 그것은 FN 보유 및 액세스 할 때까지 (또 다시) 평가하지 않는 중간 클래스에 매핑합니다.
예 그렇습니다. 그것은 FN 보유 및 액세스 할 때까지 (또 다시) 평가하지 않는 중간 클래스에 매핑합니다.
def mapValues[W](f: V => W): Map[K, W] = new MappedValues(f)
당신이 게으른 평가를하지 않으려면 엄격한지도를 사용합니다. 그건:
collection map { case (k, v) => (k, fn(v)) }
-
==============================
2.이 평가하여 한 번만 스칼라 게으른 발에서 다른 - MappedValues 구현은 모든 액세스의 기능을 평가 있음을 유의하십시오. 코드를 단계별로 때 두 배의 출력을 볼 수 있습니다. , 값을 반복합니다 디버거 창에서 발 foo는 확장 기능 (FN)를 호출하고 디버그 출력을 생성.
이 평가하여 한 번만 스칼라 게으른 발에서 다른 - MappedValues 구현은 모든 액세스의 기능을 평가 있음을 유의하십시오. 코드를 단계별로 때 두 배의 출력을 볼 수 있습니다. , 값을 반복합니다 디버거 창에서 발 foo는 확장 기능 (FN)를 호출하고 디버그 출력을 생성.
당신이지도의 t 및 기능 FN에 대한 코드를 제공하는 경우, 우리는 도움을 줄 수 있습니다.
from https://stackoverflow.com/questions/39474314/is-scala-mapvalues-lazy by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 왜 스칼라에서 def``와`var`을 무시하는 것은 불가능? (0) | 2019.11.24 |
---|---|
[SCALA] 같은 발견하고 필요한 데이터 유형과 스파크에서 : "오류 형식이 일치하지 않습니다" (0) | 2019.11.24 |
[SCALA] 비 단락 자바 / 스칼라 논리 (부울) 연산자를위한이 좋은 용도는? (0) | 2019.11.24 |
[SCALA] 왜 asInstanceOf ClassCastException를 슬로우하지 않는 이유는 무엇입니까? (0) | 2019.11.24 |
[SCALA] 스칼라에서 변수 이름으로 "형"단어를 사용하는 방법이 있나요? (0) | 2019.11.24 |