¿Cuál es la mejor manera de agregar condicionalmente a una colección inmutable en Scala? [cerrado] -- scala camp codereview Relacionados El problema

What is the best way to conditionally add to an immutable collection in Scala? [closed]


4
vote

problema

Español
cerrado. Esta pregunta es off-topic . Actualmente no está aceptando respuestas.

¿Quieres mejorar esta pregunta? Actualizar la pregunta por lo que es on-topic para el intercambio de pila de revisión de código.

cerrado 6 años .

Mejorar esta pregunta

Me encuentro frecuentemente tratando de construir las SEC basadas en algunos condicionales, pero el código que termino con se siente verboso y clunky. Un ejemplo:

  def generateSeq(foo: Option[String]) = {   Map("bar" -> "baz") ++ ( if (foo.isDefined) {       Map("foo" -> foo.get)     } else {       Nil     } ) }   

Si fuera Python, simplemente haría:

  def generateObject(foo):     obj = {}     obj["bar"] = "baz"     if foo: obj["foo"] = foo     return obj   

¿Hay una forma más limpia de escribir el código SCALA (especialmente, ya que agrego más lógica y condicionos involucrados en la construcción del mapa)?

Original en ingles

I find myself frequently trying to build up Seq's based on some conditionals, but the code I end up with feels verbose and clunky. An example:

def generateSeq(foo: Option[String]) = {   Map("bar" -> "baz") ++ ( if (foo.isDefined) {       Map("foo" -> foo.get)     } else {       Nil     } ) } 

If it were Python, I would simply do:

def generateObject(foo):     obj = {}     obj["bar"] = "baz"     if foo: obj["foo"] = foo     return obj 

Is there a cleaner way to write the Scala code (especially as I add more logic and conditionals involved in building the map)?

  

Lista de respuestas

6
 
vote
vote
La mejor respuesta
 

Puede usar el hecho de que Map() ++ None == Map() Junto con Map() ++ Some((k,v)) == Map((k,v)) y Option.map Para obtener el siguiente patrón:

  def generateObject(foo: Option[String]) = {   Map("bar" -> "baz") ++ foo.map("foo" -> _) }   
 

You can use the fact that Map() ++ None == Map() along with Map() ++ Some((k,v)) == Map((k,v)) and Option.map to get the following pattern:

def generateObject(foo: Option[String]) = {   Map("bar" -> "baz") ++ foo.map("foo" -> _) } 
 
 
1
 
vote

Es completamente posible escribir su código Python en el mismo estilo en Scala, solo porque tiene una colección inmutable no significa que no pueda agregar elementos: la sintaxis solo se ve de manera diferente.

Un ejemplo para reescribir su función:

  def generateObject(foo: Option[String]) = {   var m = Map("bar" -> "baz")   foo foreach { elem => m += ("foo" -> elem) }   m }   

Otro ejemplo que no necesita el var :

  def generateObject(foo: Option[String]) = {   val m = Map("bar" -> "baz")   foo map (elem => m + ("foo" -> elem)) getOrElse m }   
 

It is completely possible to write your Python code in the same style in Scala, just because you have an immutable collection doesn't mean you can't add elements to it - the syntax just looks differently.

One example to rewrite your function:

def generateObject(foo: Option[String]) = {   var m = Map("bar" -> "baz")   foo foreach { elem => m += ("foo" -> elem) }   m } 

Another example which doesn't need the var:

def generateObject(foo: Option[String]) = {   val m = Map("bar" -> "baz")   foo map (elem => m + ("foo" -> elem)) getOrElse m } 
 
 

Relacionados problema

6  Implementación de índice de equilibrio  ( Equilibrium index implementation ) 
He encontrado una solución a la problema de índice de equilibrio con la ayuda de las respuestas fuera aquí : val in = Stream(-7, 1, 5, 2, -4, 3, 0) val ...

2  Scala Mastermind Solver, que es la más scala-ish  ( Scala mastermind solver which is the most scala ish ) 
Estoy tratando de expresar el Kata TDD clásico de Mastermind en la Scala Idiomática que puedo. Aquí hay una suite de prueba escalada: buf1 y mi implemen...

6  Secuencia de fecha de construcción en Scala  ( Construct date sequence in scala ) 
Quiero tener una secuencia de fecha continua como ['2014-01-01', '2014-01-02', ...] Entonces defino un arroyo para hacer eso. def daySeq(start: Date): St...

8  Generación de mazmorras en Scala  ( Dungeon generation in scala ) 
Recientemente he comenzado a aprender Scala, y mientras me he encontrado con sus conceptos antes (inmutabilidad, tuplas, funciones de primera clase) No estoy ...

4  "Funcionalizando" este método de caminar de árbol y limpiándolo  ( Functionalizing this tree walking method and cleaning it up ) 
Tengo una clase 99887776655443316 que representa un árbol binario de negativo / positivo. Estoy buscando mejorar mi método OdbcConnection7 y hazlo más fun...

11  Escáner en Scala  ( Scanner in scala ) 
que quería implementar 'código> 99887766555443333 / Código> en Scala. El objetivo de esta clase es: implementar una interfaz de colección SCALA (probable...

6  Una implementación de Scala del método de ajuste Java  ( A scala implementation of the java trim method ) 
Soy un principiante de Scala y mirando el método $_{456}$3655443323 de la API de Java. Noté los efectos secundarios, así que intenté implementar una versión...

3  Árbol de búsqueda binaria de Scala  ( Scala binary search tree ) 
En un intento de profundizar en Scala, decidí hacer un BST usando tantos conceptos interesantes como sea posible para explorar todo lo que Scala tiene para of...

2  Un generador de laberinto Scala en estilo funcional  ( A scala maze generator in functional style ) 
Me pregunto si hay más que puedo hacer para incorporar más principios de programación de Scala y funcionales idiomáticos. Sé que el laberinto es silencioso, p...

3  Definiendo la transposición en una colección de colecciones irregulares  ( Defining transpose on a collection of irregular collections ) 
Me pidieron que presentara mi solicitud de revisión de código en https: //stackoverflow.com/questions/10672046/defining-transpose-on-a-collection-of-irregula...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos