Function.andThen în Java

Leagă două funcții una după alta: f.andThen(g) rulează întâi f, apoi g; f.compose(g) rulează întâi g, apoi f.

Sintaxă
default <V> Function<T, V> andThen(Function<? super R, ? extends V> dupa)
default <V> Function<V, R> compose(Function<? super V, ? extends T> inainte)

Ce face Function.andThen

f.andThen(g) creează o funcție nouă care aplică întâi f și apoi g pe rezultat: g(f(x)). Este ordinea naturală de citire: „curăță textul, apoi scrie-l cu majuscule”.

f.compose(g) face invers: aplică întâi g, apoi f: f(g(x)). Ordinea contează când operațiile nu sunt interschimbabile, de exemplu „adaugă 10” și „dublează”.

Funcțiile originale nu se schimbă; primești o funcție nouă, pe care o poți lega mai departe sau o poți da lui map.

Parametri

Parametru Descriere
dupa Pentru andThen: funcția aplicată pe rezultat.
inainte Pentru compose: funcția aplicată mai întâi, pe intrare.

Ce returnează

O Function nouă, compusă din cele două.

Exemple

Exemplul 1: andThen față de compose

import java.util.function.Function;

public class Main {
    public static void main(String[] args) {
        Function<Integer, Integer> plus10 = x -> x + 10;
        Function<Integer, Integer> dublu = x -> x * 2;

        System.out.println("plus10.andThen(dublu): " + plus10.andThen(dublu).apply(5));
        System.out.println("plus10.compose(dublu): " + plus10.compose(dublu).apply(5));
    }
}

Rezultat

plus10.andThen(dublu): 30
plus10.compose(dublu): 20

Exemplul 2: Un lanț de curățare a textului

Numele scrise de utilizatori trec prin aceeași „conductă”: spații eliminate, majusculă la început, salut.

import java.util.List;
import java.util.function.Function;

public class Main {
    public static void main(String[] args) {
        Function<String, String> curata = String::strip;
        Function<String, String> majuscula = s -> s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase();
        Function<String, String> salut = s -> "Bună, " + s + "!";

        Function<String, String> tot = curata.andThen(majuscula).andThen(salut);

        List.of("  ana ", "MIHAI", " ioana").stream()
                .map(tot)
                .forEach(System.out::println);
    }
}

Rezultat

Bună, Ana!
Bună, Mihai!
Bună, Ioana!

Greșeli frecvente

  • Confunzi ordinea: f.andThen(g) înseamnă „întâi f”, f.compose(g) înseamnă „întâi g”.
  • Încerci andThen pe o lambda scrisă direct, fără tip: (x -> x + 1).andThen(...) nu compilează. Pune lambda într-o variabilă de tip Function mai întâi.

Comenzi înrudite

  • Function: O funcție care primește o valoare de tip T și returnează una de tip R; o apelezi cu apply.
  • Function.identity: Funcția care returnează exact valoarea primită; utilă în toMap și groupingBy când elementul însuși e cheia sau valoarea.
  • UnaryOperator: O Function în care intrarea și ieșirea au același tip (T → T); folosită de List.replaceAll și Stream.iterate.
  • Predicate.and: Combină condiții: and (ambele adevărate), or (cel puțin una) și negate (condiția inversă).