ProgramingTip

Scala : mapValues가 뷰를 생성하는 이유는 무엇이며 대안이 있습니까?

bestdevel 2020. 12. 27. 19:39
반응형

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) }일을하고 약간 장황합니다. 따라서이 질문의 목적은 다음과 가변합니다.

  1. 이 사실을 모르는 사람들을 상기 시키십시오.
  2. 그들이 mapValues출력 을 만드는 이유를 찾으십시오 view.
  3. 콘크리트를 생산하는 대체 방법이 있는지 여부 Map.
  4. 이 트랩이있는 다른 일반적으로 사용되는 수집 방법이 있습니까?

감사합니다.


이것에 대한 티켓이 있습니다, SI-4776 (YT에 의해).

그것을 소개하는 커밋은 다음과 같이.

jrudolph의 제안에 따라 추상지도를 filterKeys만들고 mapValues변형하고 불변지도를위한 복제 기능을 수행합니다. 이전 transformfilterNot일반지도에 불변에서. 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)

반환 된 유형이 실제로보기가 아니라는 것은 부끄러운 일입니다! 명명 된 '힘'이라고 부를 수 있었을 것입니다 ...

참조 URL : https://stackoverflow.com/questions/14882642/scala-why-mapvalues-produces-a-view-and-is-there-any-stable-alternatives

반응형