Usando pares em Java
1. Visão geral
Neste artigo rápido, discutimos o conceito de programação altamente útil conhecido comoPair. Pairs fornecem uma maneira conveniente de lidar com chave simples para associação de valor e são particularmente úteis quando queremos retornar dois valores de um método.
Uma implementação simples de aPair está disponível nas principais bibliotecas Java. Além disso, certas bibliotecas de terceiros, como Apache Commons e Vavr, expuseram essa funcionalidade em suas respectivas APIs.
Leitura adicional:
O Java HashMap sob o capô
Um guia rápido e prático para os componentes internos do Hashmap
Iterar sobre um mapa em Java
Aprenda maneiras diferentes de iterar através das entradas de um mapa em Java.
Java - Combine várias coleções
Um guia rápido e prático para combinar várias coleções em Java
2. Implementação Core Java
2.1. A classePair
A classePair pode ser encontrada no pacotejavafx.util. O construtor desta classe usa dois argumentos, uma chave e seu valor correspondente:
Pair pair = new Pair<>(1, "One");
Integer key = pair.getKey();
String value = pair.getValue();
Este exemplo ilustra um mapeamento simples deInteger aString usando o conceito de par.
Conforme mostrado, a chave no objetopair é recuperada invocando um métodogetKey() enquanto o valor é recuperado chamandogetValue().
2.2. AbstractMap.SimpleEntry eAbstractMap.SimpleImmutableEntry
SimpleEntry é definido como uma classe aninhada dentro da classeAbstractMap. Para criar um objeto desse tipo, podemos fornecer uma chave e um valor ao construtor:
AbstractMap.SimpleEntry entry
= new AbstractMap.SimpleEntry<>(1, "one");
Integer key = entry.getKey();
String value = entry.getValue();
A chave e o valor podem ser acessados através dos métodos padrão getter e setter.
Além disso, a classeAbstractMap também contém uma classe aninhada que representa um par imutável: a classeSimpleImmutableEntry:
AbstractMap.SimpleImmutableEntry entry
= new AbstractMap.SimpleImmutableEntry<>(1, "one");
Isso funciona de maneira semelhante à classe de pares mutáveis, exceto que o valor do par não pode ser alterado. Tentar fazer isso resultará em umUnsupportedOperationException.
3. Apache Commons
Na biblioteca Apache Commons, podemos encontrar a classePair no pacoteorg.apache.commons.lang3.tuple. Esta é uma classe abstrata, portanto não pode ser instanciada diretamente.
Podemos encontrar aqui, duas subclasses - representando pares imutáveis e mutáveis:ImmutablePaireMutablePair.
Ambas as implementações têm acesso aos métodos get / key setter de chave / valor:
ImmutablePair pair = new ImmutablePair<>(2, "Two");
Integer key = pair.getKey();
String value = pair.getValue();
Sem surpresa, uma tentativa de invocarsetValue() noImmutablePair resulta em umUnsupportedOperationException.
Mas a operação é totalmente válida para uma implementação mutável:
Pair pair = new MutablePair<>(3, "Three");
pair.setValue("New Three");
4. Vavr
Na biblioteca Vavr, a funcionalidade de par é fornecida pela classeTuple2 imutável:
Tuple2 pair = new Tuple2<>(4, "Four");
Integer key = pair._1();
String value = pair._2();
Nesta implementação, não podemos modificar o objeto após a criação, portanto, os métodos mutantes estão retornando uma nova instância que inclui a alteração fornecida:
tuplePair = pair.update2("New Four");
5. Alternativa I - Classe de Container Simples
Pela preferência do usuário ou na ausência de qualquer uma das bibliotecas mencionadas acima, uma solução padrão para a funcionalidade do par está criando uma classe de contêiner simples que agrupa os valores de retorno desejados.
A maior vantagem aqui é a capacidade de fornecer nosso nome, o que ajuda a evitar que a mesma classe represente diferentes objetos de domínio:
public class CustomPair {
private String key;
private String value;
// standard getters and setters
}
6. Alternativa II - Arrays
Outra solução comum é usar uma matriz simples com dois elementos para obter resultados semelhantes:
private Object[] getPair() {
// ...
return new Object[] {key, value};
}
Normalmente, a chave está localizada no índice zero da matriz, enquanto seu valor correspondente está localizado no índice um.
7. Conclusão
Neste tutorial, discutimos o conceito dePairs em Java e as diferentes implementações disponíveis no núcleo do Java, bem como em outras bibliotecas de terceiros.
Como sempre, você pode encontrar o código por trás deste tutorialon Github.