UnaryOperator în Java

O Function în care intrarea și ieșirea au același tip (T → T); folosită de List.replaceAll și Stream.iterate.

Sintaxă
import java.util.function.UnaryOperator;

@FunctionalInterface
public interface UnaryOperator<T> extends Function<T, T>
static <T> UnaryOperator<T> identity()

Ce face UnaryOperator

UnaryOperator<T> este o Function<T, T>: primește un T și returnează tot un T. Se apelează tot cu apply. Exemple: „scrie textul cu majuscule”, „mărește prețul cu 10%”.

Unele metode cer exact acest tip: list.replaceAll(UnaryOperator) înlocuiește fiecare element cu rezultatul operației, iar Stream.iterate(start, UnaryOperator) calculează următorul element din cel anterior. Pentru numere există IntUnaryOperator, fără împachetare.

Ce returnează

apply returnează o valoare de același tip cu intrarea.

Exemple

Exemplul 1: replaceAll cu un UnaryOperator

import java.util.ArrayList;
import java.util.List;
import java.util.function.UnaryOperator;

public class Main {
    public static void main(String[] args) {
        UnaryOperator<String> majuscule = String::toUpperCase;
        List<String> orase = new ArrayList<>(List.of("iași", "cluj", "arad"));
        orase.replaceAll(majuscule);
        System.out.println(orase);

        UnaryOperator<Double> scumpire = pret -> Math.round(pret * 1.10 * 100) / 100.0;
        System.out.println(scumpire.apply(25.0));
    }
}

Rezultat

[IAȘI, CLUJ, ARAD]
27.5

Exemplul 2: Stream.iterate: dublarea unei sume

Operatorul primește suma de anul trecut și o dă pe cea de anul acesta.

import java.util.function.UnaryOperator;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        UnaryOperator<Integer> dobanda = suma -> suma + suma / 10;
        Stream.iterate(1000, dobanda)
                .limit(5)
                .forEach(s -> System.out.println(s + " lei"));
    }
}

Rezultat

1000 lei
1100 lei
1210 lei
1331 lei
1464 lei

Greșeli frecvente

  • Dai o Function<String, String> lui replaceAll: nu compilează, deși face același lucru. Declari variabila ca UnaryOperator sau scrii lambda direct în apel.
  • Folosești UnaryOperator<Integer> pentru calcule intense cu numere. IntUnaryOperator evită împachetarea.

Comenzi înrudite

  • Function: O funcție care primește o valoare de tip T și returnează una de tip R; o apelezi cu apply.
  • BinaryOperator: O funcție care combină două valori de același tip într-una (T, T → T); folosită de reduce, toMap și Map.merge.
  • Stream.iterate: Creează un stream din formule: iterate pornește de la o valoare și aplică un pas, generate cere fiecare valoare unui Supplier.
  • Function.identity: Funcția care returnează exact valoarea primită; utilă în toMap și groupingBy când elementul însuși e cheia sau valoarea.