Scala collections wizardry - Scalapeño

5 min read Original article ↗

More Related Content

Introduction to NumPy (PyData SV 2013)

Real World Haskell: Lecture 5

Functional programming with_scala

What's hot

Abstracting over the Monad yielded by a for comprehension and its generators

Scientific Computing with Python - NumPy | WeiYuan

Mutable data types in python

Quicksort - a whistle-stop tour of the algorithm in five languages and four p...

Faster persistent data structures through hashing

Python - Numpy/Pandas/Matplot Machine Learning Libraries

1.Array and linklst definition

Addendum to ‘Monads do not Compose’

Introduction to numpy Session 1

Statistics - ArgMax Equation

Viewers also liked

Carolina castro segundo parcial_tarea2

Principios diseño de interacción

Exposiçao: Kandinsky - Tudo começa num ponto

Interplay Project. National Indigenous Research and Knowledges Network (NIRAK...

7th Etherum Meetup Vienna: Crypto Token Economy - Price of ETH, Bitcoin 1.0 a...

ZAYANN : Parcours pédagogique entre nature et culture

Scala Parallel Collections

Similar to Scala collections wizardry - Scalapeño

Getting Started With Scala

Scala collections api expressivity and brevity upgrade from java

Introduction to parallel and distributed computation with spark

Collections Framework Begineers guide 2

Collections Framework Beginners Guide 2

Intro to Functional Programming in Scala

Scala or functional programming from a python developer's perspective

Demystifying functional programming with Scala

Functional programming with Scala

Introduction à Scala - Michel Schinz - January 2010

Scala. Introduction to FP. Monads

Recently uploaded

The Human Hack: How Cyber Criminals Manipulate Human Psychology

Risk to Patient Delta, Excipients in Digital Twins and Pharma 5.0 - NIPTE 2030

How to Verify a Registered Geomatics Professional on the SAGC Website: A Step...

What makes an AI agent enterprise-ready?

Spacecraft Guidance Quick Research Guide by Arthur Morgan

Comprehensive Guide to JavaScript Functions: Declarations, Expressions, and C...

Dev Dives: Build production-ready process apps with pro-code & AI

NANOTECHNOLOGY, ITS MAIN APPLICATIONS AND IMPACTS ON SOCIETY.pdf

Comprehensive Overview of Web Fundamentals and Modern Web Architectures

Chapter 7 Administering Security in computer security.pdf

NYC ACE 28-Jan-2026- RovoCon Workshop-Combined Presentation.pdf

"How Agentic AI Works – AI Input Sources, Processing, Action Layer & Output |...

The Ai-ESG for Pharmaceutical Generics Companies in EU

Comprehensive Guide to Landed Cost Configuration and Trade Operations

Introduction to LLM Post-Training Techniques

Databricks Demystified_ Unleashing the Power of Unified Data & AI for the Mod...

AI_Powered_RM-ODP_System_Design for beginners

"Ethical AI Practices, Future Trends & How Businesses Can Leverage AI for Gro...

Comprehensive Guide to JavaScript Objects: Creation, Manipulation, and Usage

SRE Made Easy: Comprehensive Guide to Site Reliability Engineering and Servic...

Scala collections wizardry - Scalapeño

  • 1.
  • 2.

    Warm up example: Fibonaccisequence val fibs: Stream[Int] = 0 #:: fibs.scanLeft(1)(_ + _) Key concepts: • Recursive values • Streams • Scan • Binary place-holder notation

  • 3.

    Immutable collections You’ll knowabout • Avoid memory allocation for empty collections • Optimize for small collections • Equal-hashCode contract • Asymptotic behavior of common operations

  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

    Computing a derivative defderivative(nums: Iterable[Double]) = nums.sliding(2) .map (pair => pair._2 - pair._1) What can be improved in this solution? Bonus question: change a few characters to find the max slope

  • 14.
  • 15.

    Word n-grams val range= 1 to 3 val text = "hello sweet world" val tokenize = (s: String) => s.split(" ") range flatMap (size => tokenize(text) sliding size) Result: Vector(Array(hello), Array(sweet), Array(world), Array(hello, sweet), Array(sweet, world), Array(hello, sweet, world))

  • 16.

    Are all membersof a greater than corresponding members of b val a = List(2,3,4) val b = List(1,2,3) // O(n^2) and not very elegant. (0 until a.size) forall (i => a(i) > b(i)) // O(n) but creates tuples and a temporary list. Yet, more elegant. a zip b forall (x=> x._1 > x._2) // same as above but doesn't create a temporary list (lazy) a.view zip b forall (x=> x._1 > x._2) // O(n), without tuple or temporary list creation, and even more elegant. (a corresponds b)(_ > _)

  • 17.

    Strings are collections.How come? “abc”.max @inline implicit def augmentString(x: String) = new StringOps(x) String <% StringOps <: StringLike <: IndexedSeqOptimized …

  • 18.

    Complexity of collectionoperations • Linear: – Unary: O(n): • Mappers: map, collect • Reducers: reduce, foldLeft, foldRight • Others: foreach, filter, indexOf, reverse, find, mkString – Binary: O(n+ m): • union, diff, and intersect

  • 19.

    Immutable Collections timecomplexity head tail apply update prepend append List C C L L C L Stream C C L L C L Vector eC eC eC eC eC eC Stack C C L L C L Queue aC aC L L L C Range C C C - - - String C L C L L L

  • 20.

    Mutable Collections timecomplexity head tail apply update prepend append insert ArrayBuffer C L C C L aC L ListBuffer C L L L C C L StringBuilde r C L C C L aC L MutableList C L L L C C L Queue C L L L C C L ArraySeq C L C C - - - Stack C L L L C L L ArrayStack C L C C aC L L Array C L C C - - -

  • 21.
  • 22.
  • 23.

    Equals-hashCode contract (a equalsb)  (a.hashCode == b.hashCode) All Scala collection implement the contract Bad idea: Set[Array[Int]] Good idea: Set[Vector[Int]] Bad Idea: Set[ArrayBuffer[Int]] Bad Idea: Set[collection.mutable._] Good Idea: Set[collection.immutable._]

  • 24.

    More on collectionsequality val (a, b) = (1 to 3, List(1, 2, 3)) a == b // true Q: Wait, how efficient is Range.hashCode? A: O(n) override def hashCode = util.hashing.MurmurHash3.seqHash(seq) Challenge yourself: Is there a closed (o(1)) formula for a range hashCode?

  • 25.

    Java interoperability Implicit (lessboilerplate): import collection.javaConversions._ javaCollection.filter(…) Explicit (better control): Import collection.javaConverters._ javaCollection.asScala.filter(…) scalaCollection.asJava

  • 26.

    The power oftype-level programming graph path-finding in compile time import scala.language.implicitConversions // Vertices case class A(l: List[Char]) case class B(l: List[Char]) case class C(l: List[Char]) case class D(l: List[Char]) case class E(l: List[Char]) // Edges implicit def ad[A1 <% A](x: A1) = D(x.l :+ 'A') implicit def bc[B1 <% B](x: B1) = C(x.l :+ 'B') implicit def ce[C1 <% C](x: C1) = E(x.l :+ 'C') implicit def ea[E1 <% E](x: E1) = A(x.l :+ 'E') def pathFrom(end:D) = end pathFrom(B(Nil)) // res0: D = D(List(B, C, E, A))

  • 27.

    Want to goPro? • Shapeless (Miles Sabin) – Polytypic programming & Heterogenous lists – github.com/milessabin/shapeless • Scalaxy (Olivier Chafik) – Macros for boosting performance of collections – github.com/ochafik/Scalaxy