
- Scala - Home
- Scala - Overview
- Scala - Features
- Scala - Environment Setup
- Scala - Build Tool (SBT)
- Scala - REPL
- Scala - Dot & Dotty
- Scala - Basic Syntax
- Scala - Hello World Program
- Scala - Identifiers
- Scala - Keywords
- Scala - Comments
- Scala - Code Blocks
- Scala - Semicolon
- Scala - Constructs
- Scala - Expressions
- Scala - Input and Output
- Scala - Optional Braces
- Scala - Underscore (_)
- Data Types and Variables
- Scala - Data Types
- Scala - Type Bounds
- Scala - Context Bound
- Scala - Variances
- Scala - Type Hierarchy
- Scala - Variables
- Scala - Variable Scopes
- Scala - Literals
- Scala - Numeric Types
- Scala - Boolean Types
- Scala - Char Type
- Scala - Unit Types
- Scala - Strings
- Scala - Arrays
- Scala - Null Type
- Scala - Nothing
- Scala - Any Type
- Scala - AnyRef Type
- Scala - Unified Types
- Scala - Dates and Times
- Scala - Ranges
- Scala - Multidimensional Arrays
- Scala - WrappedArray
- Scala - StringBuilder
- Scala - String Interpolation
- Scala - StringContext
- Scala - Type Casting
- Scala var vs val
- Scala Operators
- Scala - Operators
- Scala - Rules for Operators
- Scala - Arithmetic Operators
- Scala - Relational Operators
- Scala - Logical Operators
- Scala - Bitwise Operators
- Scala - Assignment Operators
- Scala - Operators Precedence
- Scala - Symbolic Operators
- Scala - Range Operator
- Scala - String Concatenation Operator
- Scala Conditional Statements
- Scala - IF ELSE
- Scala - IF-ELSE-IF-ELSE Statement
- Scala - Nested IF-ELSE Statement
- Scala Loop Statements
- Scala - Loop Statements
- Scala - while Loop
- Scala - do-while Loop
- Scala - Nested Loops
- Scala - for Loop
- Scala - break Statement
- Scala - yield Keyword
- Scala Classes & Objects
- Scala - Classes & Objects
- Scala - Constructors
- Scala - Auxiliary Constructor
- Scala - Primary Constructor
- Scala - This Keyword
- Scala - Nested Classes
- Scala - Getters and Setters
- Scala - Object Private Fields
- Scala - Singleton Object
- Scala - Companion Objects
- Scala - Creating Executable Programs
- Scala - Stateful Object
- Scala - Enumerations
- Scala - Polymorphism
- Scala - Access Modifiers
- Scala - Apply Method
- Scala - Update Methods
- Scala - UnapplySeq Method
- Scala - Inheritance
- Scala - Extending a Class
- Scala - Method Overloading
- Scala - Method Overriding
- Scala - Generic Classes
- Scala - Generic Functions
- Scala - Superclass Construction
- Scala Methods & Functions
- Scala - Methods
- Scala - Functions
- Scala - Methods vs Functions
- Scala - Main Methods
- Scala - Functions Call-by-Name
- Scala - Functions with Named Arguments
- Scala - Function with Variable Arguments
- Scala - Recursion Functions
- Scala - Default Parameter Values
- Scala - Functions without Parameters
- Scala - Implicit Parameters
- Scala - Higher-Order Functions
- Scala - Nested Functions
- Scala - Extension Methods
- Scala - Anonymous Functions
- Partially Applied Functions
- Scala - Lazy Val
- Scala - Pure Function
- Scala - Currying Functions
- Scala - Control Abstractions
- Scala - Corecursion
- Scala - Unfold
- Scala - Tail Recursion
- Scala - Infinite Sequences
- Scala - Dynamic Invocation
- Scala - Lambda Expressions
- Scala - Polymorphic Functions
- Scala Collections
- Scala - Collections
- Mutable and Immutable Collections
- Scala - Lists
- Scala - Sets
- Scala - Maps
- Scala - TreeMap
- Scala - SortedMap
- Scala - Tuples
- Scala - Iterators
- Scala - Options
- Scala - NumericRange
- Scala - Infinite Streams
- Scala - Parallel Collections
- Scala Advanced Types
- Scala - Union Types
- Scala - Intersection Types
- Scala - Type Aliases
- Scala - Structural Types
- Scala - Match Expression
- Scala - Singleton Type Operator
- Scala - Abstract Types
- Scala - Dependent Types
- Scala - Abstract Type Bounds
- Scala - Higher-Kinded Types
- Scala - Opaque Type Alias
- Scala - Path-Dependent Types
- Scala - Type Lambdas
- Scala - Type Inference
- Scala - Algebraic Data Types
- Scala Pattern Matching
- Scala - Pattern Matching
- Scala - Guards
- Scala - Variables in Patterns
- Scala - Type Patterns
- Scala - The Matchable Trait
- Scala - Matching Arrays
- Scala - Matching Lists
- Scala - Matching Tuples
- Scala - Exception Handling
- Scala - Extractors
- Scala - Pattern Bindings
- Scala - Regular Expressions
- Scala - Case Classes
- Scala - Partial Functions
- Scala - Packaging and Imports
- Scala - Implicit Imports
- Scala - Export Clauses
- Scala - Nested Packages
- Scala - Chained Packages
- Scala - Package Objects
- Scala Files I/O
- Scala - Files I/O
- Scala - Writing Files
- Scala - Listing Files
- Scala - Deleting Directories
- Scala - Check File Exists
- Scala Advanced Concepts
- Scala - Closures
- Scala - Futures
- Scala - Promises
- Scala - Traits
- Scala - Trait Mixins
- Scala - Layered Traits
- Scala - Trait Linearization
- Scala - Sealed Traits
- Scala - Transparent Traits
- Scala - Process Management
- Scala - Scaladoc
- Scala - Literal Type Arithmetic
- Scala - Inline keyword
- Scala - Def, Var & Val
- Scala - Dropped Features
- Scala Unit Testing
- Scala - Unit Testing
- Scala - uTest
- Scala - MUnit
- Scala - ScalaTest Runner
- Scala - ScalaMock
- Scala - JUnit
- Scala - Mocking
- Scala - BDD Testing
Scala - Pattern Matching on Tuple
Tuples in Scala are used in pattern matching. These decompose their elements and handle them expressively. Extending tuples with the Matchable trait for safe pattern matching.
The syntax is as follows -
Syntax
tuple match { // pattern matching logic case (element1, element2, ...) => // default case case _ => }
Basic Tuple Patterns
You can match basic tuples by their structure and contents. So you can handle tuple shapes and values. Try following example of matching tuples -
Example
object Demo { def main(args: Array[String]): Unit = { val intTuple: (Matchable, Matchable, Matchable) = (1, 2, 3) val stringTuple: (Matchable, Matchable) = ("Scala", "Java") val mixedTuple: (Matchable, Matchable, Matchable) = (1, "Scala", 3.14) println(matchTuple(intTuple)) println(matchTuple(stringTuple)) println(matchTuple(mixedTuple)) } def matchTuple(tuple: Any): String = tuple match { case (1, 2, 3) => "Tuple of Int: (1, 2, 3)" case ("Scala", "Java") => "Tuple of Strings: (Scala, Java)" case (_, "Scala", _) => "Tuple with Scala in the middle" case _ => "Unknown tuple" } }
Save the above program in Demo.scala. Use the following commands to compile and execute this program.
Command
> scalac Demo.scala > scala Demo
Output
Tuple of Int: (1, 2, 3) Tuple of Strings: (Scala, Java) Tuple with Scala in the middle
Matching Tuples with Fixed Size
You can match tuples of a specific size to ensure they conform to expected lengths. This is used for validating tuple structures. The syntax is -
Syntax
tuple match { // logic for tuple with exactly 2 elements case (a, b) => // logic for tuple with exactly 3 elements case (a, b, c) => // default case case _ => }
Try following example for matching tuples with fixed sizes -
Example
object Demo { def main(args: Array[String]): Unit = { val pair: (Matchable, Matchable) = (1, 2) val triplet: (Matchable, Matchable, Matchable) = (1, 2, 3) println(matchFixedSizeTuple(pair)) println(matchFixedSizeTuple(triplet)) } def matchFixedSizeTuple(tuple: (Matchable, Matchable)): String = tuple match { case (a, b) => "Tuple with exactly 2 elements" case _ => "Tuple with unknown size" } def matchFixedSizeTuple(tuple: (Matchable, Matchable, Matchable)): String = tuple match { case (a, b, c) => "Tuple with exactly 3 elements" case _ => "Tuple with unknown size" } }
Save the above program in Demo.scala. Use the following commands to compile and execute this program.
Command
> scalac Demo.scala > scala Demo
Output
Tuple with exactly 2 elements Tuple with exactly 3 elements
Pattern Matching with Tuple Elements
You can pattern match specific elements within tuples to extract and process values. The syntax is as follows -
Syntax
tuple match { // logic for tuples with three elements case (first, second, third) => // default case case _ => }
Try following example for matching pattern with elements of tuple -
Example
object Demo { def main(args: Array[String]): Unit = { val numbers: (Matchable, Matchable, Matchable) = (10, 20, 30) println(matchTupleElements(numbers)) } def matchTupleElements(tuple: (Matchable, Matchable, Matchable)): String = tuple match { case (first, second, third) => s"First: $first, Second: $second, Third: $third" case _ => "Tuple does not have exactly 3 elements" } }
Save the above program in Demo.scala. Use the following commands to compile and execute this program.
Command
> scalac Demo.scala > scala Demo
Output
First: 10, Second: 20, Third: 30
Matching Tuples of Different Types
You can handle tuples containing different types by pattern matching on the type of each element. The syntax is as follows -
Syntax
tuple match { // logic for tuples with specified types case (a: Int, b: String, c: Double) => // default case case _ => }
Try following example for matching tuples of different types -
Example
object Demo { def main(args: Array[String]): Unit = { val mixedTuple: (Matchable, Matchable, Matchable) = (1, "Scala", 3.14) println(matchDifferentTypesTuple(mixedTuple)) } def matchDifferentTypesTuple(tuple: (Matchable, Matchable, Matchable)): String = tuple match { case (i: Int, s: String, d: Double) => s"Int: $i, String: $s, Double: $d" case _ => "Tuple does not match expected types" } }
Save the above program in Demo.scala. Use the following commands to compile and execute this program.
Command
> scalac Demo.scala > scala Demo
Output
Int: 1, String: Scala, Double: 3.14
Handling Nested Tuples
You can match nested tuples to handle more complex data structures. You can tuple inside tuples. The syntax is as follows -
Syntax
tuple match { // logic for nested tuples case ((a, b), (c, d)) => // default case case _ => }
Try following example for handling nested tuple -
Example
object Demo { def main(args: Array[String]): Unit = { val nestedTuple: ((Matchable, Matchable), (Matchable, Matchable)) = ((1, 2), (3, 4)) println(matchNestedTuple(nestedTuple)) } def matchNestedTuple(tuple: ((Matchable, Matchable), (Matchable, Matchable))): String = tuple match { case ((1, 2), (3, 4)) => "Nested tuple: ((1, 2), (3, 4))" case _ => "Unknown nested tuple" } }
Save the above program in Demo.scala. Use the following commands to compile and execute this program.
Command
> scalac Demo.scala > scala Demo
Output
Nested tuple: ((1, 2), (3, 4))
Guards in Tuple Patterns
You can use guards in pattern matching to add additional conditions. The syntax is as follows -
Syntax
tuple match { // logic with guard condition case (a, b, c) if condition => // default case case _ => }
Try following example for guards in tuple pattern -
Example
object Demo { def main(args: Array[String]): Unit = { val numbers: (Matchable, Matchable, Matchable) = (10, 20, 30) println(matchWithGuards(numbers)) } def matchWithGuards(tuple: (Matchable, Matchable, Matchable)): String = tuple match { case (first: Int, second, third) if first > 5 => s"First is greater than 5: $first" case _ => "Tuple does not match guard condition" } }
Save the above program in Demo.scala. Use the following commands to compile and execute this program.
Command
> scalac Demo.scala > scala Demo
Output
First is greater than 5: 10
Combining Tuple Patterns with Other Patterns
Tuple patterns can be combined with other patterns to handle more complex matching. The syntax is as follows -
Syntax
(tuple, otherPattern) match { // logic for combined patterns case ((a, b), otherPattern) => // default case case _ => }
Try following example for combining tuple with other patterns -
Example
object Demo { def main(args: Array[String]): Unit = { val mixedTuple: (Matchable, Matchable) = (Person("Alice", 25), Dog("Rex")) println(matchCombinedPatterns(mixedTuple)) } case class Person(name: String, age: Int) extends Matchable case class Dog(name: String) extends Matchable def matchCombinedPatterns(tuple: (Matchable, Matchable)): String = tuple match { case (Person(name, age), Dog(dogName)) => s"Person: $name, Dog: $dogName" case _ => "Unknown pattern" } }
Save the above program in Demo.scala. Use the following commands to compile and execute this program.
Command
> scalac Demo.scala > scala Demo
Output
Person: Alice, Dog: Rex
Advanced Tuple Patterns
You can use advanced patterns to match complex and variable-length tuples. The syntax is as follows -
Syntax
tuple match { // logic for tuple starting with a specific element case (first, _*) => // logic for tuple with specific second element case (_, second, _*) => // default case case _ => }
Try following example for advanced tuple patterns -
Example
object Demo { def main(args: Array[String]): Unit = { val advancedTuple: (Matchable, Matchable, Matchable, Matchable, Matchable) = (1, 2, 3, 4, 5) println(matchAdvancedPatterns(advancedTuple)) } def matchAdvancedPatterns(tuple: (Matchable, Matchable, Matchable, Matchable, Matchable)): String = tuple match { case (1, _, _, _, _) => "Tuple starts with 1" case (_, 2, _, _, _) => "Tuple has 2 as the second element" case _ => "Unknown pattern" } }
Save the above program in Demo.scala. Use the following commands to compile and execute this program.
Command
> scalac Demo.scala > scala Demo
Output
Tuple starts with 1
Tuples Pattern Matching Summary
- You can match Tuples by structure and contents.
- You can match tuples of specific sizes to conform to expected lengths.
- You can also match specific elements within tuples to extract and process values.
- Tuples containing different types can be handled by pattern matching on the type of each element.
- You can match nested tuples and tuples with guards in pattern matching to add more conditions.
- You can combine tuple patterns with other patterns to handle more complex matching.
- You can also use advanced patterns to match complex and variable-length tuples.