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.comparingIntcom lambda para ordenar. - Use
String::toUpperCasecomo method reference emmap. - 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
- Criamos a lista
palavrascom quatro strings de tamanhos variados. palavras.stream()cria um fluxo para processamento funcional.sorted(Comparator.comparingInt(s -> s.length()))ordena as strings pelo comprimento usando a lambdas -> s.length()como extrator de chave.toList()coleta o resultado em uma nova lista imutável.- Imprimimos a lista ordenada diretamente.
- Em seguida, pegamos a lista ordenada, criamos um novo stream, aplicamos
map(String::toUpperCase)— um method reference que equivale as -> 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: semimport 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:
sortedretorna um novo stream; a lista original permanece inalterada. Se quiser modificar, usepalavras.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