Optional.equals în Java

Două Optional-uri sunt egale dacă ambele sunt goale sau au valori egale; toString afișează Optional[valoare] sau Optional.empty.

Sintaxă
boolean equals(Object obj)
int hashCode()
String toString()

Ce face Optional.equals

a.equals(b) returnează true dacă ambele sunt Optional-uri goale sau dacă amândouă au valori egale (comparate cu equals). Un Optional nu este niciodată egal cu valoarea „goală” din el: Optional.of(5).equals(5) este false.

hashCode() este codul hash al valorii (0 pentru gol). toString() returnează Optional[valoare] sau Optional.empty; formatul este pentru depanare, nu pentru afișarea către utilizatori.

Nu compara Optional-uri cu ==: rezultatul depinde de faptul că sunt sau nu același obiect.

Parametri

Parametru Descriere
obj Obiectul cu care se compară.

Ce returnează

equals: boolean. hashCode: int. toString: String.

Exemple

Exemplul 1: Comparare și afișare

import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        Optional<String> a = Optional.of("Iași");
        Optional<String> b = Optional.of("Ia" + "și".strip());
        Optional<String> gol1 = Optional.empty();
        Optional<String> gol2 = Optional.ofNullable(null);
        System.out.println("a = b: " + a.equals(b));
        System.out.println("gol = gol: " + gol1.equals(gol2));
        System.out.println("a = \"Iași\": " + a.equals("Iași"));
        System.out.println(a + " " + gol1);
        System.out.println("hash gol: " + gol1.hashCode() + ", hash egal: " + (a.hashCode() == "Iași".hashCode()));
    }
}

Rezultat

a = b: true
gol = gol: true
a = "Iași": false
Optional[Iași] Optional.empty
hash gol: 0, hash egal: true

Exemplul 2: Test simplu pentru o metodă de căutare

import java.util.List;
import java.util.Optional;

public class Main {
    static Optional<String> primulLung(List<String> cuvinte) {
        return cuvinte.stream().filter(c -> c.length() > 5).findFirst();
    }

    public static void main(String[] args) {
        boolean t1 = primulLung(List.of("mar", "portocală", "kiwi")).equals(Optional.of("portocală"));
        boolean t2 = primulLung(List.of("mar", "kiwi")).equals(Optional.empty());
        System.out.println("Test 1: " + (t1 ? "trecut" : "picat"));
        System.out.println("Test 2: " + (t2 ? "trecut" : "picat"));
    }
}

Rezultat

Test 1: trecut
Test 2: trecut

Greșeli frecvente

  • Compari un Optional direct cu o valoare: opt.equals("x") e mereu false. Scrie opt.equals(Optional.of("x")) sau opt.filter("x"::equals).isPresent().
  • Afișezi Optional-ul direct utilizatorilor și apare Optional[...]. Scoate valoarea cu orElse.

Comenzi înrudite

  • Optional: O „cutie” care conține o valoare sau este goală. Arată clar că un rezultat poate lipsi și te obligă să tratezi cazul, în loc de null.
  • Optional.of: of(x) creează un Optional cu o valoare sigur prezentă, ofNullable(x) unul care e gol dacă x este null, empty() unul gol.
  • Set.equals: Două mulțimi sunt egale dacă au exact aceleași elemente, indiferent de ordine sau de implementare (HashSet, TreeSet).
  • List.equals: Două liste sunt egale dacă au aceleași elemente în aceeași ordine, indiferent de clasa lor; hashCode urmează aceeași regulă.