Thinking Functionally in Java and the JVM

Java has quietly absorbed functional ideas over the last decade. Lambdas, streams, records, sealed types. It has been an amazing journey, but most teams still write code as if none of that really changed anything. This workshop asks a simple question: what if we actually took those features seriously?

In Thinking Functionally in Java, we explore how far disciplined functional design can take us using plain Java with no rewrites, no new language mandates, and no academic detours. Along the way, we address reproducible development environments with Nix, replace exception-driven control flow with explicit error modeling, and uncover why concepts like flatMap, algebraic data types, and composability matter even if you never say the word “monad” out loud.

  • Reproducible Java Environments with Nix – Defining a deterministic Java toolchain so “works on my machine” stops being a variable.
  • Functional Java: What We Actually Have – Referential transparency, immutability, and total functions using modern Java features.
  • Type-Driven Design: Separating data from behavior (Show, Eq) and understanding the limits of Java’s type system.
  • Composition with flatMap: Sequencing computations across Optional, streams, and error-handling types.
  • Understanding Monads: Context, short-circuiting, composition, and trade-offs without mysticism.
  • Algebraic Data Types in Java: Modeling closed domains with sealed types instead of flags and conditionals.
  • Errors as Data: Replacing exception-driven control flow with explicit result types (Either, Try).
  • Putting It Together: Designing a small, readable service that isolates side effects and composes cleanly.
  • Breaking the Java Wall: A look at higher-kinded types, effects, and what Java still can’t express in languages other than Java

About Daniel Hinojosa

Daniel is a programmer, consultant, instructor, speaker, and recent author. With over 20 years of experience, he does work for private, educational, and government institutions. He is also currently a speaker for No Fluff Just Stuff tour. Daniel loves JVM languages like Java, Groovy, and Scala; but also dabbles with non JVM languages like Haskell, Ruby, Python, LISP, C, C++. He is an avid Pomodoro Technique Practitioner and makes every attempt to learn a new programming language every year. For downtime, he enjoys reading, swimming, Legos, football, and barbecuing.

More About Daniel »