Médio Java

Ordenar strings por comprimento com method reference

Enunciado

Dada uma lista de strings, ordene-a pelo comprimento usando uma lambda e depois imprima os elementos. Em seguida, use um method reference para imprimir cada string em maiúsculas.

Requisitos

  • Use Comparator.comparingInt com lambda para ordenar.
  • Use String::toUpperCase como method reference em map.
  • Imprima a lista ordenada e depois as versões maiúsculas.

Código inicial

import java.util.Arrays;
import java.util.List;

public class OrdenaStrings {
    public static void main(String[] args) {
        List<String> palavras = Arrays.asList("banana", "kiwi", "abacaxi", "uva");
        // Seu código aqui
    }
}

Saída esperada

Ordenado: [uva, kiwi, banana, abacaxi]
Maiúsculas: UVA
Maiúsculas: KIWI
Maiúsculas: BANANA
Maiúsculas: ABACAXI
Ver dica

Use palavras.stream().sorted(Comparator.comparingInt(s -> s.length())).toList() para obter a lista ordenada.

Mostrar solução
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class OrdenaStrings {
    public static void main(String[] args) {
        List<String> palavras = Arrays.asList("banana", "kiwi", "abacaxi", "uva");

        // Ordena por comprimento usando lambda
        List<String> ordenadas = palavras.stream()
                .sorted(Comparator.comparingInt(s -> s.length()))
                .toList();
        System.out.println("Ordenado: " + ordenadas);

        // Usa method reference para transformar em maiúsculas
        ordenadas.stream()
                 .map(String::toUpperCase)
                 .forEach(s -> System.out.println("Maiúsculas: " + s));
    }
}

Passo a passo

  1. Criamos a lista palavras com quatro strings de tamanhos variados.
  2. palavras.stream() cria um fluxo para processamento funcional.
  3. sorted(Comparator.comparingInt(s -> s.length())) ordena as strings pelo comprimento usando a lambda s -> s.length() como extrator de chave.
  4. toList() coleta o resultado em uma nova lista imutável.
  5. Imprimimos a lista ordenada diretamente.
  6. Em seguida, pegamos a lista ordenada, criamos um novo stream, aplicamos map(String::toUpperCase) — um method reference que equivale a s -> s.toUpperCase() — e imprimimos cada resultado.

Por que funciona

O Comparator.comparingInt recebe uma função que extrai uma chave inteira de cada elemento. A lambda s -> s.length() implementa ToIntFunction<String>, uma interface funcional. Já String::toUpperCase é um method reference para um método de instância sem argumentos; ele implementa Function<String, String>. Isso mostra como lambdas e method references se encaixam em interfaces funcionais da biblioteca padrão.

Erros comuns

  • Esquecer de importar Comparator: sem import java.util.Comparator; o código não compila.
  • Usar sorted() sem critério: sorted() ordena naturalmente (lexicograficamente), não por comprimento. É preciso passar o comparator.
  • Tentar modificar a lista original: sorted retorna um novo stream; a lista original permanece inalterada. Se quiser modificar, use palavras.sort(...).

Outra forma de resolver

Usar Collections.sort com um comparator explícito:

palavras.sort(Comparator.comparingInt(String::length));
System.out.println("Ordenado: " + palavras);

Essa forma é preferível quando se quer ordenar a lista no lugar, sem criar um novo stream.

Saída esperada

Ordenado: [uva, kiwi, banana, abacaxi]
Maiúsculas: UVA
Maiúsculas: KIWI
Maiúsculas: BANANA
Maiúsculas: ABACAXI