Scala Tutorial
Basics
Control Statements
OOP Concepts
Parameterized - Type
Exceptions
Scala Annotation
Methods
String
Scala Packages
Scala Trait
Collections
Scala Options
Miscellaneous Topics
In Scala, the underscore (_
) is often referred to as the "wildcard" or "placeholder". This placeholder syntax can be used in various contexts, providing concise ways to represent anonymous functions, match any item, or denote unapplied methods among others. Here's an overview of how the underscore can be used as a placeholder in different situations:
The underscore can be used to denote inputs in short-form anonymous functions.
val numbers = List(1, 2, 3, 4, 5) // Double each number in the list numbers.map(_ * 2) // List(2, 4, 6, 8, 10)
For multiple parameters, you can use multiple underscores:
numbers.foldLeft(0)(_ + _) // 15
The underscore can be used to import all members of a package or object.
import scala.collection.mutable._
In pattern matching, the underscore can be used as a wildcard to match any value.
val x: Any = "Hello" x match { case _: String => println("It's a string!") case _ => println("It's something else.") }
You can use the underscore to ignore specific values when decomposing case classes.
case class Person(name: String, age: Int) val person = Person("John", 25) person match { case Person(_, 25) => println("This person is 25 years old.") case _ => }
Similar to case class decomposition, you can use underscores to destructure and ignore specific values in tuples.
val pair = (3, "Three") pair match { case (_, s) => println(s"Found string: $s") }
The underscore can be used to create a partially applied function.
def add(a: Int, b: Int): Int = a + b val add5 = add(5, _: Int) println(add5(3)) // 8
In type definitions, the underscore can be used to denote existential types.
def printList(list: List[_]): Unit = list.foreach(println)
In this example, printList
can accept a List of any type.
When you're not interested in certain values (e.g., in tuple assignments or iteration), you can use underscores.
val (_, value) = (1, "Hello") println(value) // Hello
The underscore (_
) in Scala is a versatile placeholder that can be employed in various scenarios, helping to make the code concise and expressive. Understanding the contexts in which it can be used will enable you to write more idiomatic Scala code.
Using Placeholders in Scala Anonymous Functions:
Placeholders in Scala, represented by underscores (_
), are often used in anonymous functions to represent parameters.
val addOne: Int => Int = _ + 1 val squared: Int => Int = _ * _ println(addOne(5)) // Result: 6 println(squared(3)) // Result: 9
Benefits of Using Placeholders in Scala Code:
Placeholders make code concise and expressive, reducing the need for explicit variable declarations.
val numbers = List(1, 2, 3, 4, 5) // Without placeholders val doubled1 = numbers.map(x => x * 2) // With placeholders val doubled2 = numbers.map(_ * 2)
Underscore in Scala Method Calls as a Placeholder:
Underscore can be used as a placeholder in method calls, especially when passing functions as arguments.
val numbers = List(1, 2, 3, 4, 5) // Without placeholders numbers.foreach(x => println(x)) // With placeholders numbers.foreach(println(_))
Avoiding Unnecessary Variable Declarations with Placeholders in Scala:
Placeholders help avoid unnecessary variable declarations, resulting in cleaner and more readable code.
val numbers = List(1, 2, 3, 4, 5) // Without placeholders val squared1 = numbers.map(x => { val square = x * x square }) // With placeholders val squared2 = numbers.map(_ * _)
Advanced Usage of Placeholders in Scala:
Placeholders can be used in more complex scenarios, such as in the composition of functions.
val add: (Int, Int) => Int = _ + _ val multiply: (Int, Int) => Int = _ * _ // Advanced usage val combine: (Int, Int) => Int = add andThen multiply
Here, andThen
composes two functions.