String.chars în Java

Returnează caracterele șirului ca IntStream (coduri numerice), ca să le prelucrezi cu operații de stream.

Sintaxă
IntStream chars()
IntStream codePoints()

Ce face String.chars

chars() returnează un IntStream cu codul fiecărui char din șir. Pe el poți folosi filter, count, map etc. Valorile sunt int, nu char: pentru afișare le transformi înapoi cu (char) c sau Character.toString(c).

codePoints() face același lucru, dar returnează puncte de cod Unicode întregi: un emoji, format din două valori char, apare o singură dată. Pentru text cu emoji sau caractere rare, codePoints() este varianta corectă.

Metodele vin din interfața CharSequence (Java 8) și sunt suprascrise în String din Java 9.

Ce returnează

Un IntStream nou, de la primul la ultimul caracter.

Exemple

Exemplul 1: Numărarea cifrelor și a literelor mari

public class Main {
    public static void main(String[] args) {
        String parola = "Iasi2024Ana";
        long cifre = parola.chars().filter(Character::isDigit).count();
        long mari = parola.chars().filter(Character::isUpperCase).count();
        System.out.println("Cifre: " + cifre);
        System.out.println("Litere mari: " + mari);
    }
}

Rezultat

Cifre: 4
Litere mari: 2

Exemplul 2: Literele unice, în ordine

mapToObj(Character::toString) transformă fiecare cod numeric înapoi în text.

import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        String cuvant = "constanta";
        String unice = cuvant.chars()
                .distinct()
                .mapToObj(Character::toString)
                .collect(Collectors.joining(", "));
        System.out.println(unice);
        System.out.println(cuvant.chars().sum());
    }
}

Rezultat

c, o, n, s, t, a
971

Exemplul 3: chars() vs codePoints() cu emoji

public class Main {
    public static void main(String[] args) {
        String mesaj = "Bravo 👍";
        System.out.println("chars: " + mesaj.chars().count());
        System.out.println("codePoints: " + mesaj.codePoints().count());
        mesaj.codePoints().forEach(cp -> System.out.print("[" + Character.toString(cp) + "]"));
        System.out.println();
    }
}

Rezultat

chars: 8
codePoints: 7
[B][r][a][v][o][ ][👍]

Greșeli frecvente

  • Afișezi direct valorile din chars() și obții numere (65 în loc de A). Convertește cu (char) c sau Character.toString(c).
  • Folosești chars() pe text cu emoji: un emoji este numărat de două ori și poate fi „rupt” în două jumătăți fără sens. Folosește codePoints().

Comenzi înrudite

  • String.codePointAt: Lucrează cu puncte de cod Unicode întregi (inclusiv emoji), nu cu valori char: citire, numărare, deplasare.
  • String.toCharArray: toCharArray() copiază șirul într-un array nou de char; getChars() copiază o porțiune într-un array existent.
  • Character.isLetter: Verifică dacă un caracter este literă, cifră sau oricare dintre ele, după regulile Unicode.
  • String.charAt: Returnează caracterul (char) de la poziția dată; prima poziție este 0, ultima este length() – 1.