Develop code that uses the UnaryOperator interface


🔍 O que é UnaryOperator?

A interface UnaryOperator<T> faz parte do pacote java.util.function e é uma especialização da interface Function<T, R>, onde o tipo de entrada e saída são o mesmo.

É usada quando você quer aplicar uma transformação em um único valor e retornar um valor do mesmo tipo.


📘 Assinatura funcional

@FunctionalInterface
public interface UnaryOperator<T> {
T apply(T t);
}

🧪 Exemplos práticos


✅ Exemplo 1: Dobrar um número

UnaryOperator<Integer> dobrar = n -> n * 2;
System.out.println(dobrar.apply(5));

// 10

Comentário: Aplica a função n * 2 no valor 5.


✅ Exemplo 2: Converter texto para maiúsculas

UnaryOperator<String> maiusculo = s -> s.toUpperCase();
System.out.println(maiusculo.apply("java"));

// JAVA

Comentário: Transforma a string em letras maiúsculas.


✅ Exemplo 3: Utilizando em List.replaceAll()

List<String> nomes = new ArrayList<>(Arrays.asList("joao", "maria", "ana"));
nomes.replaceAll(String::toUpperCase);
System.out.println(nomes);

// [JOAO, MARIA, ANA]

Comentário: replaceAll usa internamente UnaryOperator<T>.


❌ Pegadinhas e erros comuns

UnaryOperator<Integer> erro = x -> "resultado: " + x; 
// ❌

Erro de compilação: o tipo de retorno é String, mas o esperado é Integer.


UnaryOperator<Double> ident = x -> x; 
// ✅ válido, retorna o mesmo valor

Comentário: A identidade é válida como operador unário.


🎯 Dica para prova

  • UnaryOperator<T> = Function<T, T>.
  • Ideal para listas com replaceAll, Stream.map, etc.
  • Prefira usar UnaryOperator quando não há conversão de tipo.

🧠 Quiz com 5 questões

1) O que faz a interface UnaryOperator<T>?
A) Recebe dois argumentos e retorna um
B) Recebe e retorna valores do mesmo tipo
C) Concatena strings
D) Sempre retorna void


2) Qual das opções abaixo é um exemplo válido de UnaryOperator<String>?
A) x -> x.length()
B) x -> x.toUpperCase()
C) x -> x + 1
D) x -> x.equals("abc")


3) Qual é o tipo de dado retornado pelo método apply() da interface UnaryOperator<T>?
A) void
B) int
C) boolean
D) T


4) Como você aplicaria UnaryOperator para inverter o sinal de um número?
A) n -> -n
B) n -> n++
C) n -> n.toString()
D) n -> "negativo"


5) Qual método de List aceita diretamente um UnaryOperator como argumento?
A) forEach
B) stream()
C) replaceAll
D) filter


✅ Gabarito com comentários

  1. BUnaryOperator<T> recebe e retorna o mesmo tipo
  2. BtoUpperCase() mantém o tipo String
  3. D – O retorno de apply() é do mesmo tipo T
  4. A – Inverter o sinal de um número é feito com -n
  5. CList.replaceAll(UnaryOperator) aplica a função a todos os elementos

🧠 Resumo visual

InterfaceEntradaSaídaUso comum
UnaryOperator<T>TTTransformações simples
Equivalente aFunction<T, T>Mesmo tipo de entrada/saída
Exemplox -> x * 2Dobrar valores