рдХреНрдпрд╛ рдЖрдк "рд╕реНрдкрд╖реНрдЯ" рд╕рдВрдЧреНрд░рд╣ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдХреИрд▓рд╛рдбреЛрдХ рдкрдврд╝рддреЗ рд╣реИрдВ? рдпрд╛ рдЖрд▓рд╕ рд╣рдореЗрд╢рд╛ рдЕрдЪреНрдЫрд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрддрд╛

рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рд╡реЗ рдХреИрд╕реЗ рднрд┐рдиреНрди рд╣реИрдВ


someMap.map{ case (k, v) => k -> foo(v)} 

рдФрд░


 someMap.mapValues(foo) 

рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдпрд╛ рдЖрдкрдХреЛ рд╕рдВрджреЗрд╣ рд╣реИ / рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рдЕрдВрддрд░ рдХреЗ рдХреНрдпрд╛ рдмреБрд░реЗ рдкрд░рд┐рдгрд╛рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдХрд╣рд╛рдВ identity рд╣реЛрддреА identity , рддреЛ рдпрд╣ рд▓реЗрдЦ рдЖрдкрдХреЗ рд▓рд┐рдП рд╣реИред


рдЕрдиреНрдпрдерд╛, рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕реНрдерд┐рдд рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдореЗрдВ рднрд╛рдЧ рд▓реЗрдВред


рдПрдХ рд╕рд░рд▓ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ


рдЖрдЗрдП рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХрдЯ рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдерд┐рдд рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:


 val someMap = Map("key1" -> "value1", "key2" -> "value2") def foo(value: String): String = value + "_changed" val resultMap = someMap.map{case (k,v) => k -> foo(v)} val resultMapValues = someMap.mapValues(foo) println(s"resultMap: $resultMap") println(s"resultMapValues: $resultMapValues") println(s"equality: ${resultMap == resultMapValues}") 

рдЗрд╕ рдХреЛрдб рдХреЗ рдкреНрд░рд┐рдВрдЯ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ


 resultMap: Map(key1 -> value1_changed, key2 -> value2_changed) resultMapValues: Map(key1 -> value1_changed, key2 -> value2_changed) equality: true 

рдФрд░ рдЗрд╕ рд╕реНрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, mapValues рд╡рд┐рдзрд┐ рдХреА рд╕рдордЭ рд╕реНрдХрд╛рд▓рд╛ рдХреЛ рд╕реАрдЦрдиреЗ рдХреЗ рд╢реБрд░реБрдЖрддреА рдЪрд░рдгреЛрдВ рдореЗрдВ mapValues рд╣реИ: рдареАрдХ рд╣реИ, рд╣рд╛рдБ, рдРрд╕реА рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ, рдЬрдм рдЪрд╛рдмрд┐рдпрд╛рдБ рдирд╣реАрдВ рдмрджрд▓рддреА рд╣реИрдВ рддреЛ Map рдореЗрдВ рдорд╛рди рдмрджрд▓рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдХреНрдпрд╛ рд╣реИ? рд╡рд┐рдзрд┐ рдХреЗ рдирд╛рдо рд╕реЗ, рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реНрдкрд╖реНрдЯ рд╣реИред


рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдг


рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ (рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдРрд╕реЗ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦреВрдВрдЧрд╛ рддрд╛рдХрд┐ рдЖрдк рдпрд╣ рди рд╕реЛрдЪреЗрдВ рдХрд┐ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рддреЛрдВ рдХреЗ рд╕рд╛рде рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рд╣реЛрддреА рд╣реИ):


 case class ValueHolder(value: String) val someMap: Map[String, String] = Map("key1" -> "value1", "key2" -> "value2") def foo(value: String): ValueHolder = ValueHolder(value) val resultMap: Map[String, ValueHolder] = someMap.map{case (k,v) => k -> foo(v)} val resultMapValues: Map[String, ValueHolder] = someMap.mapValues(foo) println(s"resultMap: $resultMap") println(s"resultMapValues: $resultMapValues") println(s"equality: ${resultMap == resultMapValues}") 

рдФрд░ рд▓реЙрдиреНрдЪ рдХреЗ рдмрд╛рдж рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХрд╛ рдЙрддреНрдкрд╛рджрди рд╣реЛрдЧрд╛


 resultMap: Map(key1 -> ValueHolder(value1), key2 -> ValueHolder(value2)) resultMapValues: Map(key1 -> ValueHolder(value1), key2 -> ValueHolder(value2)) equality: true 

рдпрд╣ рдХрд╛рдлреА рддрд╛рд░реНрдХрд┐рдХ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИред "рдпрд╛рд░, рдпрд╣ рд▓реЗрдЦ рдХреЗ рддрд▓ рдкрд░ рдЬрд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ!" - рдкрд╛рдардХ рдХрд╣реЗрдВрдЧреЗред рдЖрдЗрдП, рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдмрд╛рд╣рд░реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдВ рдФрд░ рдореБрд╣рд╛рд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рд░рд▓ рдЬрд╛рдБрдЪреЗрдВ рдЬреЛрдбрд╝реЗрдВ:


 case class ValueHolder(value: String, seed: Int) def foo(value: String): ValueHolder = ValueHolder(value, Random.nextInt()) ... println(s"simple assert for resultMap: ${resultMap.head == resultMap.head}") println(s"simple assert for resultMapValues: ${resultMapValues.head == resultMapValues.head}") 

рдЙрддреНрдкрд╛рджрди рдореЗрдВ рд╣рдо рдкреНрд░рд╛рдкреНрдд:


 resultMap: Map(key1 -> ValueHolder(value1,1189482436), key2 -> ValueHolder(value2,-702760039)) resultMapValues: Map(key1 -> ValueHolder(value1,-1354493526), key2 -> ValueHolder(value2,-379389312)) equality: false simple assert for resultMap: true simple assert for resultMapValues: false 

рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдЕрдм рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╣реИрдВред рд▓реЗрдХрд┐рди рд░реБрдХрд┐рдП, рджреВрд╕рд░реЗ рджрд╛рд╡реЗ рдХреЛ false рдХреНрдпреЛрдВ рдмрддрд╛рдпрд╛? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ resultMapValues рдХреЗ рдореВрд▓реНрдп рдмрджрд▓ рдЧрдП рд╣реИрдВ, рд╣рдордиреЗ рдЙрдирдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ? рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЕрдВрджрд░ рд╕рдм рдХреБрдЫ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдерд╛:


 println(s"resultMapValues: $resultMapValues") println(s"resultMapValues: $resultMapValues") 

рдФрд░ рд╣рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ:


 resultMapValues: Map(key1 -> ValueHolder(value1,1771067356), key2 -> ValueHolder(value2,2034115276)) resultMapValues: Map(key1 -> ValueHolder(value1,-625731649), key2 -> ValueHolder(value2,-1815306407)) 

рдЫрд╡рд┐


рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реБрдЖ?


println Map рдХрд╛ рдорд╛рди рдХреНрдпреЛрдВ рдмрджрд▓рддрд╛ рд╣реИ?
mapValues рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдЖрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ:


  /** Transforms this map by applying a function to every retrieved value. * @param f the function used to transform values of this map. * @return a map view which maps every key of this map * to `f(this(key))`. The resulting map wraps the original map without copying any elements. */ 

рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рд╣рдореЗрдВ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рд╣рдордиреЗ рдХреНрдпрд╛ рд╕реЛрдЪрд╛ рдерд╛ - рдпрд╣ Map рдмрджрд▓рддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдорд╛рди рдХреЗ рддрд░реНрдХреЛрдВ рдореЗрдВ рдкрд╛рд░рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рдмрд╣реБрдд рдзреНрдпрд╛рди рд╕реЗ рдФрд░ рдЕрдВрдд рддрдХ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ Map рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди "рдореИрдк рд╡реНрдпреВ" (рджреЗрдЦреЗрдВ)ред рдФрд░ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╢реНрдп ( View ) рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдк view рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрд┐рд╕рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ force рд╡рд┐рдзрд┐ рд╣реИред рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ (рдХреЛрдб рд╕реНрдХреИрд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг 2.12.7 рд╕реЗ рд╣реИ, рд▓реЗрдХрд┐рди 2.11 рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдПрдХ рд╣реА рдмрд╛рдд рд╣реИ):


 protected class MappedValues[W](f: V => W) extends AbstractMap[K, W] with DefaultMap[K, W] { override def foreach[U](g: ((K, W)) => U): Unit = for ((k, v) <- self) g((k, f(v))) def iterator = for ((k, v) <- self.iterator) yield (k, f(v)) override def size = self.size override def contains(key: K) = self.contains(key) def get(key: K) = self.get(key).map(f) } 

рдпрджрд┐ рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреБрдЫ рднреА рдХреИрд╢ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдореВрд▓реНрдпреЛрдВ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛рдПрдЧреАред рд╣рдо рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреНрдпрд╛ рджреЗрдЦрддреЗ рд╣реИрдВред


рдпрджрд┐ рдЖрдк рд╢реБрджреНрдз рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдм рдХреБрдЫ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдареАрдХ рд╣реИ, рд╢рд╛рдпрдж рдкреНрд░рджрд░реНрд╢рди рдЪрд▓реЗрдЧрд╛ред рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдорд╛рд░реА рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕рдм рдХреБрдЫ рд╕рд╛рдл рдФрд░ рдкрд░рд┐рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрди рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рд░реЗрдХ рдкрд░ рдХрджрдо рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреЛ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рд╣реБрдЖ рдерд╛, рдЕрдиреНрдпрдерд╛ рдпрд╣ рд▓реЗрдЦ рдирд╣реАрдВ рд╣реЛрддрд╛)ред


рдмреЗрд╢рдХ, рд╣рдо рдЗрд╕ рдкрд╛рд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдкрд╣рд▓реЗ рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реИрдВред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 2011 рдореЗрдВ, рдЗрд╕ рдЕрд╡рд╕рд░ рдкрд░ рдПрдХ рдмрдбрд╝рд╛ рдмрдЧ рдЦреЛрд▓рд╛ рдЧрдпрд╛ рдерд╛ (рдФрд░ рд▓реЗрдЦрди рдХреЗ рд╕рдордп, рдЗрд╕реЗ рдЦреБрд▓реЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдЗрд╕рдореЗрдВ filterKeys рд╡рд┐рдзрд┐ рдХрд╛ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ filterKeys рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╣реА рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, 2015 рдХреЗ рдмрд╛рдж рд╕реЗ, IntelliJ Idea рдореЗрдВ рдирд┐рд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯрд┐рдХрдЯ рд▓рдЯрдХрд╛ рд╣реБрдЖ рд╣реИред


рдХреНрдпрд╛ рдХрд░реЗрдВ?


рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрдкрд╛рдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ рдирд╛рдо рд╕реЗ, рдЙрдирдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдмрд╣реБрдд рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИред


рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк map(identity) рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИред
identity , рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдЗрдирдкреБрдЯ рддрд░реНрдХ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЦреНрдп рд╡рд┐рдзрд┐ map рд╡рд┐рдзрд┐ рд╣реИ, рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп Map ред рдЪрд▓реЛ рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:


 val resultMapValues: Map[String, ValueHolder] = someMap.mapValues(foo).map(identity) println(s"resultMapValues: $resultMapValues") println(s"simple assert for resultMapValues: ${resultMapValues.head == resultMapValues.head}") println(s"resultMapValues: $resultMapValues") println(s"resultMapValues: $resultMapValues") 

рд╣рдореЗрдВ рдЬреЛ рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд▓рддрд╛ рд╣реИ


 resultMapValues: Map(key1 -> ValueHolder(value1,333546604), key2 -> ValueHolder(value2,228749608)) simple assert for resultMapValues: true resultMapValues: Map(key1 -> ValueHolder(value1,333546604), key2 -> ValueHolder(value2,228749608)) resultMapValues: Map(key1 -> ValueHolder(value1,333546604), key2 -> ValueHolder(value2,228749608)) 

рд╕рдм рдареАрдХ рд╣реИ :)


рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдЖрд▓рд╕ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдб рдХреЛ рдмрджрд▓рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛред рдЖрдк mapValues рдФрд░ filterKeys рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд░реНрдЧ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдирдпрд╛ рдирд╛рдо рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЙрдирдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдпрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ .view рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдЬреЛрдбрд╝реЗ рдХреЗ .view рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ / рдХрд╣реАрдВ рдФрд░ рд╡рд┐рдХрд╛рд╕ рдкрд░реНрдпрд╛рд╡рд░рдг / рдирд┐рдпрдо рдореЗрдВ рдирд┐рд░реАрдХреНрд╖рдг рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдЬреЛ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рд░реЗрдХ рдкрд░ рдХрджрдо рд░рдЦрдиреЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдкрд░рд┐рдгрд╛рдо рднреБрдЧрддрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕ рдкрд░ рдереЛрдбрд╝рд╛ рд╕рдордп рдмрд┐рддрд╛рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред


рдЖрдк рд░реЗрдХ рдкрд░ рдФрд░ рдХреИрд╕реЗ рдХрджрдо рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рдордиреЗ рдЙрди рдкрд░ рдХреИрд╕реЗ рдХрджрдо рд░рдЦрд╛


рдмрд╛рд╣рд░реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рд╛рде рдорд╛рдорд▓реЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬреЛ рд╣рдордиреЗ рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рджреЗрдЦрд╛ рдерд╛, рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдореВрд▓реНрдп (рдиреЛрдЯ, рдпрд╣рд╛рдБ рд╕рддрд╣реА рдирдЬрд╝рд░ рдореЗрдВ рд╕рдм рдХреБрдЫ "рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп" рд╣реИ):


 val someMap1 = Map("key1" -> new AtomicInteger(0), "key2" -> new AtomicInteger(0)) val someMap2 = Map("key1" -> new AtomicInteger(0), "key2" -> new AtomicInteger(0)) def increment(value: AtomicInteger): Int = value.incrementAndGet() val resultMap: Map[String, Int] = someMap1.map { case (k, v) => k -> increment(v) } val resultMapValues: Map[String, Int] = someMap2.mapValues(increment) println(s"resultMap (1): $resultMap") println(s"resultMapValues (1): $resultMapValues") println(s"resultMap (2): $resultMap") println(s"resultMapValues (2): $resultMapValues") 

рдпрд╣ рдХреЛрдб рдЗрд╕ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛:


 resultMap (1): Map(key1 -> 1, key2 -> 1) resultMapValues (1): Map(key1 -> 1, key2 -> 1) resultMap (2): Map(key1 -> 1, key2 -> 1) resultMapValues (2): Map(key1 -> 2, key2 -> 2) 

рдЬрдм рдореИрдВрдиреЗ рдХреБрдЫ someMap2 рдлрд┐рд░ рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛, someMap2 рдПрдХ рдордЬреЗрджрд╛рд░ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рд╛ред


mapValues рдФрд░ filterKeys рдХрд╛ рдЙрдкрдпреЛрдЧ filterKeys рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ, рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд рдореЗрдВ рд╡реГрджреНрдзрд┐ рдФрд░ / рдпрд╛ рдЬреАрд╕реА рдкрд░ рдмрдврд╝реЗ рд╣реБрдП рд▓реЛрдб рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЛрдВ рдкрд░ рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░ рд╣реИ рдФрд░ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред


рдЖрдкрдХреЛ toSeq рдХреА toSeq рд╡рд┐рдзрд┐ рдХреЛ рд╕рдорд╛рди рд░реЗрдХ рдХреЗ рдЧреБрд▓реНрд▓рдХ рдореЗрдВ рднреА рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдПрдХ рдЖрд▓рд╕реА Stream рджреЗрддрд╛ рд╣реИред


рд╣рдо рджреБрд░реНрдШрдЯрдирд╛ рд╕реЗ mapValues рдкрд░ рд░реЗрдХ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╡рд┐рдзрд┐ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдХрд┐ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╡рд┐рдиреНрдпрд╛рд╕ рд╕реЗ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛: рдХреБрдВрдЬреА рд╣реИрдВрдбрд▓рд░ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдереЗ, рдФрд░ рдореВрд▓реНрдп рдЙрдирдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдереЗ, рдЬреЛ рддрдм рд╕реНрд╡рдпрдВ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЧрдП рдереЗ (рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛)ред рдЪреВрдВрдХрд┐ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдХреЗрд╡рд▓ рд╢реБрджреНрдз рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рдереЗ, рдЗрд╕рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд┐рдпрд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рднреА рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ (рд░реЗрдХ рд▓реЗрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рдорд╛рдк рд▓рд┐рдпрд╛)ред


рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдореБрдЭреЗ рдХреЗрд╡рд▓ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рднрд╛рд░реА рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдПрдХ рд╕реЗрдорд╛рдлреЛрд░ рдмрдирд╛рдирд╛ рдкрдбрд╝рд╛, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдиреНрдп рд╣реИрдВрдбрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдлрд┐рд░ рдкрд░реАрдХреНрд╖рдг рдкрд░реНрдпрд╛рд╡рд░рдг рдкрд░ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╢реБрд░реВ рд╣реЛ рдЧрдИрдВ - рдорд╛рдиреНрдп рдХреЛрдб рдЬрд┐рд╕рдиреЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдареАрдХ рдХрд╛рдо рдХрд┐рдпрд╛, рд╡рд╣ рдЕрд░реНрдзрдЪрд╛рд▓рдХ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛрдиреЗ рд▓рдЧрд╛ред рдмреЗрд╢рдХ, рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЕрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИрдВред рдЬрдм рддрдХ рд╣рдо рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдирд╣реАрдВ рдЖрдП рдХрд┐ рд╣рдордиреЗ "рдХреБрдЫ рдЦреЗрд▓, рдХреНрдпреЛрдВ рд╡рд┐рднрд┐рдиреНрди рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?" рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдкрд░ рдерд╛ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рд╣рдореЗрдВ mapValues рдХреЛ mapValues рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрд╛ред


рдпрджрд┐ рдЖрдк рдЕрдкрд╛рдЪреЗ рд╕реНрдкрд╛рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рдкрд░ рдареЛрдХрд░ рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рдЖрдк рдЕрдЪрд╛рдирдХ рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ .mapValues рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЗ рдХреБрдЫ рдкреНрд░рд╛рдердорд┐рдХ рдХреЗ рд▓рд┐рдП рдЖрдк рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред


 java.io.NotSerializableException: scala.collection.immutable.MapLike$$anon$2 

https://stackoverflow.com/questions/32900862/map-can-not-be-serializable-in-scala
https://issues.scala-lang.org/browse/SI-7005
рд▓реЗрдХрд┐рди map(identity) рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЖрдорддреМрд░ рдкрд░ рдЧрд╣рд░реА рдЦреБрджрд╛рдИ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкреНрд░реЗрд░рдгрд╛ / рд╕рдордп рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред


рдирд┐рд╖реНрдХрд░реНрд╖


рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╕рдмрд╕реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рджреБрдмрдХ рд╕рдХрддреА рд╣реИрдВ - рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЙрди рддрд░реАрдХреЛрдВ рдореЗрдВ рднреА рдЬреЛ 100% рд╕реНрдкрд╖реНрдЯ рд▓рдЧрддреЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рд╕рдорд╕реНрдпрд╛, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдПрдХ рдЦрд░рд╛рдм рдкрджреНрдзрддрд┐ рдХреЗ рдирд╛рдо рдФрд░ рдПрдХ рдЕрдкрд░реНрдпрд╛рдкреНрдд рд╕рдЦреНрдд рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЬреБрдбрд╝реА рд╣реИред


рдмреЗрд╢рдХ, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдФрд░, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, "рд╕реНрдкрд╖реНрдЯ рдЪреАрдЬреЛрдВ" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░реЗрд░рдгрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред


рдЕрдХреЗрд▓реЗ рдЖрд▓рд╕реА рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдПрдХ рдЕрдЪреНрдЫрд╛ рдордЬрд╛рдХ рд╣реИ, рдФрд░ рд▓реЗрдЦ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рдЖрд▓рд╕реНрдп рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ - рдЗрд╕рд╕реЗ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред


рдирд┐рд╖реНрдкрдХреНрд╖рддрд╛ рдореЗрдВ, mapValues рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреБрд╡рд╛рдж рдореЗрдВ mapValues рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрддреА рдереА , рд▓реЗрдХрд┐рди рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдЙрд╕ рд▓реЗрдЦ рдХреЛ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╕рд┐рд░ рдореЗрдВ рдмрд╣реБрдд рдмреБрд░реА рддрд░рд╣ рд╕реЗ рдбрд╛рд▓ рджрд┐рдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдХрдИ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬреНрдЮрд╛рдд / рдмреБрдирд┐рдпрд╛рджреА рдЪреАрдЬреЗрдВ рдереАрдВ рдФрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЦрддрд░рд╛ рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:


FilterKeys рд╡рд┐рдзрд┐ рдХрд┐рд╕реА рднреА рддрддреНрд╡ рдХреЛ рдХреЙрдкреА рдХрд┐рдП рдмрд┐рдирд╛ рд╕реНрд░реЛрдд рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд▓рдкреЗрдЯрддреА рд╣реИред рд╡рд╣рд╛рдБ рдХреБрдЫ рднреА рдЧрд▓рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рд╢рд╛рдпрдж рд╣реА рдлрд╝рд┐рд▓реНрдЯрд░рдХреА рд╕реЗ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ

рдпрд╣реА рд╣реИ, рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рд╣реИ, рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЖрдк рд░реЗрдХ рдкрд░ рднреА рдереЛрдбрд╝рд╛ рдХрджрдо рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЗрд╕реЗ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред


тЖТ рд▓реЗрдЦ рдХрд╛ рд╕рд╛рд░рд╛ рдХреЛрдб рдЗрд╕ рд╕рд╛рд░ рдореЗрдВ рд╣реИ

Source: https://habr.com/ru/post/hi430538/


All Articles