Scala : mapValues가 뷰를 생성하는 이유는 무엇이며 대안이 있습니까?
지금은 그것이 mapValues
보기를 제공 하는 사실에 놀랐습니다 . 결과는 다음 예에 나와 있습니다.
case class thing(id: Int)
val rand = new java.util.Random
val distribution = Map(thing(0) -> 0.5, thing(1) -> 0.5)
val perturbed = distribution mapValues { _ + 0.1 * rand.nextGaussian }
val sumProbs = perturbed.map{_._2}.sum
val newDistribution = perturbed mapValues { _ / sumProbs }
아이디어는 내가 여기서 가지고있는 것인데, 이는 임의성으로 교란 된 다음 그것을 재 정규화합니다. 는 실제로 원래 코드의 의도에 실패 이후 mapValues
을 생산하고 view
, _ + 0.1 * rand.nextGaussian
때마다 평가 re-항상 perturbed
사용됩니다.
나는 지금 같은 distribution map { case (s, p) => (s, p + 0.1 * rand.nextGaussian) }
일을하고 약간 장황합니다. 따라서이 질문의 목적은 다음과 가변합니다.
- 이 사실을 모르는 사람들을 상기 시키십시오.
- 그들이
mapValues
출력 을 만드는 이유를 찾으십시오view
. - 콘크리트를 생산하는 대체 방법이 있는지 여부
Map
. - 이 트랩이있는 다른 일반적으로 사용되는 수집 방법이 있습니까?
감사합니다.
이것에 대한 티켓이 있습니다, SI-4776 (YT에 의해).
그것을 소개하는 커밋은 다음과 같이.
jrudolph의 제안에 따라 추상지도를
filterKeys
만들고mapValues
변형하고 불변지도를위한 복제 기능을 수행합니다. 이전transform
및filterNot
일반지도에 불변에서. phaller의 검토.
jrudolph 원래 제안을의 찾을 수 없었지만 mapValues
더 효율적 으로 만들기 위해 수행되었다고 생각합니다 . 놀라운 일이 수 있습니다. 질문, 부여 mapValues
입니다 당신이 한 번 이상 값을 가능성을 반복하지 않을 경우입니다.
해결 방법으로 mapValues(...).view.force
새로운 Map
.
스칼라 문서는 다음과 같이.
모든 매핑하는지도보기
key
에이지도의f(this(key))
. 결과 맵은 요소를 복사하지 않고 원래 맵을 래핑합니다.
그래서 그것은 예상되어야하지만 저를 많이 무섭게합니다. 저는 내일 많은 코드를 검토해야 할 것입니다. 나는 그런 행동을 기대하지 않았다 :-(
다른 해결 방법 :
toSeq
복사본을 가져 오기 오기 위해 호출 할 수있는 매핑에 다시 필요한 경우 필요한 toMap
개체를 만들고 사용에 대한 성능 영향을 미칩니다.map
mapValues
보기를 만들지 않는 경우에는 표시 수 있습니다. 내일 할 수있는 사람 내 전에하지 않고 여기에 코드를 게시 할 것입니다;)
편집하다 :
보기를 '강제'하고 mapValues 뒤에 '.map (identity)'를 사용하는 쉬운 방법을 찾았습니다 (특정 기능을 구현할 필요가 없음).
scala> val xs = Map("a" -> 1, "b" -> 2)
xs: scala.collection.immutable.Map[java.lang.String,Int] = Map(a -> 1, b -> 2)
scala> val ys = xs.mapValues(_ + Random.nextInt).map(identity)
ys: scala.collection.immutable.Map[java.lang.String,Int] = Map(a -> 1315230132, b -> 1614948101)
scala> ys
res7: scala.collection.immutable.Map[java.lang.String,Int] = Map(a -> 1315230132, b -> 1614948101)
반환 된 유형이 실제로보기가 아니라는 것은 부끄러운 일입니다! 명명 된 '힘'이라고 부를 수 있었을 것입니다 ...
'ProgramingTip' 카테고리의 다른 글
Django REST 프레임 워크의 중첩 된 리소스에 필터를 적용해야합니까? (0) | 2020.12.27 |
---|---|
Android에서 최고의 REST 클라이언트 프레임 워크 / 유틸리티 (0) | 2020.12.27 |
AsyncTask와 Thread / Runnable의 차이점 (0) | 2020.12.27 |
.NET 용 그래프 데이터베이스 (0) | 2020.12.27 |
데이터베이스 테이블이 더 이상 액세스되고 있는지 어떻게 알 수 있습니까? (0) | 2020.12.27 |