Scala es un lenguaje conciso y expresivo, y una de sus herramientas más versátiles es el underscore (_). Aunque parece un simple guion bajo, su significado depende del contexto, y puede representar una variable anónima, un tipo genérico, una función parcial, o incluso un importador wildcard. Vamos a repasar sus usos principales con ejemplos simples.
Cuando usás una función que espera un argumento, podés usar _ para decir “acá va ese argumento”.
val nums = List(1, 2, 3)
val dobles = nums.map(_ * 2) // equivale a nums.map(x => x * 2)
Esto es súper útil para evitar código repetitivo.
Se puede utilizar para ignorar parámetros no usados
Cuando definís una función pero no te interesa usar todos los parámetros:
val funcion = (_: Int) => 42 // ignora el valor que recibe y siempre retorna 42
También se usa para desestructuración parcial:
val (a, _) = (1, 2) // Ignora el segundo valor
Importaciones tipo wildcard. Igual que en Java con *, pero en Scala se usa _:
import scala.collection.mutable._ // importa todas las clases de mutable
Referencia a métodos como funciones. Cuando pasás un método como función, usas _ para convertirlo a función de orden superior:
def cuadrado(x: Int): Int = x * x
val lista = List(1, 2, 3).map(cuadrado) // OK
val lista2 = List(1, 2, 3).map(cuadrado _) // También válido, por conversión explícita
Inicialización por defecto en clases o valores:
var x: String = _ // valor por defecto: null
var y: Int = _ // valor por defecto: 0
Esto es más común en Java-style code o interoperabilidad con frameworks como Spark o Akka.
Tipos genéricos anónimos, como vimos antes:
val lista: List[_] = List("a", 1, true) // lista de algún tipo desconocido
También podés usar _ <: Animal o _ >: Perro para acotar subtipos o supertypos.
Podés dejar argumentos sin aplicar en una llamada y usar _ para marcar que falta ese valor:
def multiplicar(a: Int, b: Int): Int = a * b
val porDos = multiplicar(2, _: Int) // función que multiplica por 2
println(porDos(5)) // 10
Dominar el uso del _ te permite escribir código Scala más idiomático y elegante.