Guia da Tabela de Goiaba
1. Visão geral
Neste tutorial, mostraremos como usar a interfaceTable do Google Guava e suas várias implementações.
Table do Guava é uma coleção que representa uma estrutura semelhante a uma tabela contendo linhas, colunas e os valores de células associados. A linha e a coluna atuam como um par de chaves ordenado.
2. Table do Google Guava
Vamos dar uma olhada em como usar a classeTable.
2.1. Dependência do Maven
Vamos começar adicionando a dependência da biblioteca Guava do Google empom.xml:
com.google.guava
guava
21.0
A versão mais recente da dependência pode ser verificadahere.
2.2. Sobre
Se tivéssemos que representarTable de Guava usandoCollections presente no núcleo do Java, então a estrutura seria um mapa de linhas onde cada linha contém um mapa de colunas com valores de células associados.
Table representa um mapa especial onde duas chaves podem ser especificadas de maneira combinada para se referir a um único valor.
É semelhante a criar um mapa de mapas, por exemplo,Map<UniversityName, Map<CoursesOffered, SeatAvailable>>. Table também seria uma maneira perfeita de representar o tabuleiro do jogo Battleships.
3. Criando
Você pode criar uma instância deTable de várias maneiras:
-
Usando o métodocreate da classeHashBasedTable que usaLinkedHashMap internamente:
Table
universityCourseSeatTable = HashBasedTable.create(); -
Se precisarmos de umTable cujas chaves de linha e as chaves de coluna precisam ser ordenadas por sua ordem natural ou fornecendo comparadores, você pode criar uma instância deTable usando o métodocreate de uma classe chamadaTreeBasedTable, que usaTreeMap internamente:
Table
universityCourseSeatTable = TreeBasedTable.create(); -
Se conhecermos as chaves de linha e de coluna de antemão e o tamanho da tabela for fixo, use o métodocreate da classeArrayTable:
List
universityRowTable = Lists.newArrayList("Mumbai", "Harvard"); List courseColumnTables = Lists.newArrayList("Chemical", "IT", "Electrical"); Table universityCourseSeatTable = ArrayTable.create(universityRowTable, courseColumnTables); -
Se pretendemos criar uma instância imutável deTable cujos dados internos nunca vão mudar, use a classeImmutableTable (criação que segue um padrão builder):
Table
universityCourseSeatTable = ImmutableTable. builder() .put("Mumbai", "Chemical", 120).build();
4. Usando
Vamos começar com um exemplo simples que mostra o uso deTable.
4.1. Recuperação
Se conhecermos a chave da linha e a chave da coluna, podemos obter o valor associado à linha e à chave da coluna:
@Test
public void givenTable_whenGet_returnsSuccessfully() {
Table universityCourseSeatTable
= HashBasedTable.create();
universityCourseSeatTable.put("Mumbai", "Chemical", 120);
universityCourseSeatTable.put("Mumbai", "IT", 60);
universityCourseSeatTable.put("Harvard", "Electrical", 60);
universityCourseSeatTable.put("Harvard", "IT", 120);
int seatCount
= universityCourseSeatTable.get("Mumbai", "IT");
Integer seatCountForNoEntry
= universityCourseSeatTable.get("Oxford", "IT");
assertThat(seatCount).isEqualTo(60);
assertThat(seatCountForNoEntry).isEqualTo(null);
}
4.2. Verificando uma entrada
Podemos verificar a presença de uma entrada em umTable com base em:
-
Chave de linha
-
Chave da coluna
-
Chave de linha e chave de coluna
-
Valor
Vamos ver como verificar a presença de uma entrada:
@Test
public void givenTable_whenContains_returnsSuccessfully() {
Table universityCourseSeatTable
= HashBasedTable.create();
universityCourseSeatTable.put("Mumbai", "Chemical", 120);
universityCourseSeatTable.put("Mumbai", "IT", 60);
universityCourseSeatTable.put("Harvard", "Electrical", 60);
universityCourseSeatTable.put("Harvard", "IT", 120);
boolean entryIsPresent
= universityCourseSeatTable.contains("Mumbai", "IT");
boolean courseIsPresent
= universityCourseSeatTable.containsColumn("IT");
boolean universityIsPresent
= universityCourseSeatTable.containsRow("Mumbai");
boolean seatCountIsPresent
= universityCourseSeatTable.containsValue(60);
assertThat(entryIsPresent).isEqualTo(true);
assertThat(courseIsPresent).isEqualTo(true);
assertThat(universityIsPresent).isEqualTo(true);
assertThat(seatCountIsPresent).isEqualTo(true);
}
4.3. Remoção
Podemos remover uma entrada deTable fornecendo a chave de linha e a chave de coluna:
@Test
public void givenTable_whenRemove_returnsSuccessfully() {
Table universityCourseSeatTable
= HashBasedTable.create();
universityCourseSeatTable.put("Mumbai", "Chemical", 120);
universityCourseSeatTable.put("Mumbai", "IT", 60);
int seatCount
= universityCourseSeatTable.remove("Mumbai", "IT");
assertThat(seatCount).isEqualTo(60);
assertThat(universityCourseSeatTable.remove("Mumbai", "IT")).
isEqualTo(null);
}
4.4. Chave de linha para mapa de valor de célula
Podemos obter uma representaçãoMap com a chave como uma linha e o valor comoCellValue fornecendo a chave da coluna:
@Test
public void givenTable_whenColumn_returnsSuccessfully() {
Table universityCourseSeatTable
= HashBasedTable.create();
universityCourseSeatTable.put("Mumbai", "Chemical", 120);
universityCourseSeatTable.put("Mumbai", "IT", 60);
universityCourseSeatTable.put("Harvard", "Electrical", 60);
universityCourseSeatTable.put("Harvard", "IT", 120);
Map universitySeatMap
= universityCourseSeatTable.column("IT");
assertThat(universitySeatMap).hasSize(2);
assertThat(universitySeatMap.get("Mumbai")).isEqualTo(60);
assertThat(universitySeatMap.get("Harvard")).isEqualTo(120);
}
4.5. Representação de mapa de aTable
Podemos obter uma representaçãoMap<UniversityName, Map<CoursesOffered, SeatAvailable>> usando o métodocolumnMap:
@Test
public void givenTable_whenColumnMap_returnsSuccessfully() {
Table universityCourseSeatTable
= HashBasedTable.create();
universityCourseSeatTable.put("Mumbai", "Chemical", 120);
universityCourseSeatTable.put("Mumbai", "IT", 60);
universityCourseSeatTable.put("Harvard", "Electrical", 60);
universityCourseSeatTable.put("Harvard", "IT", 120);
Map> courseKeyUniversitySeatMap
= universityCourseSeatTable.columnMap();
assertThat(courseKeyUniversitySeatMap).hasSize(3);
assertThat(courseKeyUniversitySeatMap.get("IT")).hasSize(2);
assertThat(courseKeyUniversitySeatMap.get("Electrical")).hasSize(1);
assertThat(courseKeyUniversitySeatMap.get("Chemical")).hasSize(1);
}
4.6. Chave de coluna para mapa de valor de célula
Podemos obter uma representaçãoMap com a chave como uma coluna e o valor comoCellValue fornecendo a chave de linha:
@Test
public void givenTable_whenRow_returnsSuccessfully() {
Table universityCourseSeatTable
= HashBasedTable.create();
universityCourseSeatTable.put("Mumbai", "Chemical", 120);
universityCourseSeatTable.put("Mumbai", "IT", 60);
universityCourseSeatTable.put("Harvard", "Electrical", 60);
universityCourseSeatTable.put("Harvard", "IT", 120);
Map courseSeatMap
= universityCourseSeatTable.row("Mumbai");
assertThat(courseSeatMap).hasSize(2);
assertThat(courseSeatMap.get("IT")).isEqualTo(60);
assertThat(courseSeatMap.get("Chemical")).isEqualTo(120);
}
4.7. Obter Chave de Linha Distinta
Podemos obter todas as chaves de linha de uma tabela usando o métodorowKeySet:
@Test
public void givenTable_whenRowKeySet_returnsSuccessfully() {
Table universityCourseSeatTable
= HashBasedTable.create();
universityCourseSeatTable.put("Mumbai", "Chemical", 120);
universityCourseSeatTable.put("Mumbai", "IT", 60);
universityCourseSeatTable.put("Harvard", "Electrical", 60);
universityCourseSeatTable.put("Harvard", "IT", 120);
Set universitySet = universityCourseSeatTable.rowKeySet();
assertThat(universitySet).hasSize(2);
}
4.8. Obter chave de coluna distinta
Podemos obter todas as chaves de coluna de uma tabela usando o métodocolumnKeySet:
@Test
public void givenTable_whenColKeySet_returnsSuccessfully() {
Table universityCourseSeatTable
= HashBasedTable.create();
universityCourseSeatTable.put("Mumbai", "Chemical", 120);
universityCourseSeatTable.put("Mumbai", "IT", 60);
universityCourseSeatTable.put("Harvard", "Electrical", 60);
universityCourseSeatTable.put("Harvard", "IT", 120);
Set courseSet = universityCourseSeatTable.columnKeySet();
assertThat(courseSet).hasSize(3);
}
5. Conclusão
Neste tutorial, ilustramos os métodos da classeTable da biblioteca Guava. A classeTable fornece uma coleção que representa uma estrutura semelhante a uma tabela contendo linhas, colunas e valores de células associados.
O código pertencente aos exemplos acima pode ser encontrado emthe GitHub project - este é um projeto baseado em Maven, portanto, deve ser fácil de importar e executar como está.