Functional Programming in Groovy

Closures as first-class values, composition (>>, <<), currying (curry, rcurry, ncurry), memoization (memoize, @Memoized), trampolining (trampoline, @TailRecursive).

Immutability: @Immutable, records, asImmutable(), List.of, final.

Higher-order GDK methods: collect, findAll, inject, groupBy, collectEntries, sum, every/any, takeWhile.

Java Streams and Optional integrate naturally:

Function types: java.util.function.* with closures via SAM coercion. Closure<V> generic return types.

Libraries: Functional Java, Vavr (persistent collections, Try, Either), and Groovy's groovy.lang.Tuple2..Tuple16.

import java.util.stream.*
def total = (1..10).stream().filter { it % 2 == 0 }.mapToInt { it * it }.sum()
def opt = Optional.ofNullable(null).map { it.toString() }.orElse("empty")
def grouped = ["apple", "avocado", "banana"].stream().collect(Collectors.groupingBy { it[0] })
println total, opt, grouped