제가 설명 할 수없는 결과가 나오는 테스트가 있습니다.스칼라 컬렉션을 사용할 때 이상한 결과가 있습니다.
첫 번째 테스트는 필터 매핑 4 개 요소를 포함하는 목록을 줄이기 않습니다 동안 한번 필터링시 각 요소에 대해, 한 번 각 요소 : I 예상대로 카운터가 11 배 증가
{
val counter = new AtomicInteger(0)
val l = List(1, 2, 3, 4)
val filtered = l.filter{ i =>
counter.incrementAndGet()
true
}
val mapped = filtered.map{ i =>
counter.incrementAndGet()
i*2
}
val reduced = mapped.reduce{ (a, b) =>
counter.incrementAndGet()
a+b
}
println("counted " + counter.get + " and result is " + reduced)
assert(20 == reduced)
assert(11 == counter.get)
}
을 매핑 및 3 번을 추가하여 4 가지 요소를 추가합니다.
사용하여 와일드 카드 결과 변경 :
{
val counter = new AtomicInteger(0)
val l = List(1, 2, 3, 4)
val filtered = l.filter{
counter.incrementAndGet()
_ > 0
}
val mapped = filtered.map{
counter.incrementAndGet()
_*2
}
val reduced = mapped.reduce{ (a, b) =>
counter.incrementAndGet()
a+b
}
println("counted " + counter.get + " and result is " + reduced)
assert(20 == reduced)
assert(5 == counter.get)
}
나는 감소 (코드 나던 컴파일)에 와일드 카드를 사용하는 방법을 작동하지 않을 수 있습니다,하지만 지금은, 카운터는 5 회로 증가!
질문 1 : 와일드 카드가 카운터를 호출하는 횟수를 변경하는 이유는 무엇이며 어떻게 작동합니까?
내 두 번째 관련 질문. 뷰에 대한 나의 이해는 모나드 메서드에 전달 된 함수를 느리게 실행한다는 것이었지만 다음 코드는이를 보여주지 않습니다.
{
val counter = new AtomicInteger(0)
val l = Seq(1, 2, 3, 4).view
val filtered = l.filter{
counter.incrementAndGet()
_ > 0
}
println("after filter: " + counter.get)
val mapped = filtered.map{
counter.incrementAndGet()
_*2
}
println("after map: " + counter.get)
val reduced = mapped.reduce{ (a, b) =>
counter.incrementAndGet()
a+b
}
println("after reduce: " + counter.get)
println("counted " + counter.get + " and result is " + reduced)
assert(20 == reduced)
assert(5 == counter.get)
}
출력은 다음과 같습니다
after filter: 1
after map: 2
after reduce: 5
counted 5 and result is 20
질문 # 2 : 어떻게 기능이 바로 실행되는 거지? 나는 당신은 아마
filter {
println
_ > 0
}
이
filter{ i =>
println
i > 0
}
을 의미하지만 스칼라는 다른 생각을 가지고 생각하고 스칼라 2.10
정말 Rex Kerr의 대답을 받아 들여야합니다 (그리고 칭찬할만한 말은 아닙니다)! –
그래도 경험에 따르면 다른 답변을 기다리는 것이 좋습니다. –