programing tip

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

itbloger 2020. 12. 26. 09:35
반응형

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때마다 평가 재 항상 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

반응형