Java 8: Stream API – Parte 3, conhecendo a API

17_1

Esse artigo será a continuação da visão geral da API de Stream API. No post anterior, tivemos os primeiros contatos com a API. Nesse post, nosso objetivo é continuar falando um pouco mais. Manteremos o mesmo modelo dos capítulos anteriores.

public class Team {
private List players;
…
}

public class Player {

private String name;

private int gols;

private Position position;

//...
}

public enum Position {
GOALKEEPER,DEFENDER, FORWARDS
}

É possível verificar se um, todos ou nenhum elemento dentro da estrutura atende a uma condição, para isso, se pode utilizar os métodos anyMath, allMatch ou noneMach respectivamente.

public boolean hasDefender() {
return players.stream().anyMatch(Player::isDefender);
}

public boolean noHasDefender() {
return players.stream().anyMatch(Player::isDefender);
}

public boolean justHasDefender() {
return players.stream().anyMatch(Player::isDefender);
}

Com o min e max retorna o maior e o menor elemento respectivamente como critério ele usa um Comparator que é passado como parâmetro.

public Player getGoalscorer() {
return players.stream().max(Comparator.comparing(Player::getGols).reversed()).get();
}

public Player getLessGoalscorer() {
return players.stream().min(Comparator.comparing(Player::getGols).reversed()).get();
}

Caso a nossa classe Player, tenha implementado o equals e hashCode, que é uma boa prática em Java, é possível usar o distinct, que semelhante ao comportamento do banco de dados, garante que os dados não se repitam.

public List getGoalscorer() {
return players.stream().distinct().collect(Collectors.toList());
}

Além do mapeamento normal, que é por referência, é possível realizar o mapeamento para três tipos primitivos: int, double, long com os métodos mapToInt, mapToDouble e mapToLong respectivamente. Não é necessário se preocupar caso esteja trabalhando com o wrapper, os objetos Long, Double, e Integer terão a conversão automática, autoinboxing. Com o IntStream, LongStream e DoubleStream é possível realizar algumas operações dentro da coleção como valor máximo, mínimo e média.

public int getMaxGoalsFromPlayer() {
return players.stream().mapToInt(Player::getGols).max().getAsInt();
}

public int getMinGoalsFromPlayer() {
return players.stream().mapToInt(Player::getGols).min().getAsInt();
}

public double getAverageGoalsFromPlayer() {
return players.stream().mapToInt(Player::getGols).average().getAsDouble();
}

Também é possível retornar o stream primitivo para o seu respectivo wrapper (Stream<Integer>, Stream<Double> ou Stream<Long>). Além da possibilidade realizar conversão entre os tipos primitivos.

public LongSummaryStatistics getMinGoalsFromPlayerAsLong() {
return players.stream().mapToInt(Player::getGols).asLongStream().summaryStatistics();
}

public List getGolsAsDouble() {
return players.stream().mapToInt(Player::getGols).asDoubleStream().boxed().collect(Collectors.toList());
}

Como último tópico será discutido o recurso flatmap. Com o flatmap é possível extrair um Stream dentro de outro Stream. Para exemplificar será adicionado mais um modelo: A seleção. Uma seleção é composta por diversos times de um país.

public class NationalTeam {

private List teams;

public NationalTeam(List teams) {
this.teams = teams;
}
}

Para um exemplo simples serão retornados todos os jogadores dos times, porém limitados por onze jogadores.

public List getPlayers() {
return teams.stream().flatMap(t -> t.getPlayers().stream()).limit(11L).collect(Collectors.toList());
}

Naturalmente, durante a competição a seleção seleciona os melhores onze jogadores para os campeonatos, assim como critério será selecionado os onze que fizeram mais gols.

public List getPlayers() {
return teams.stream().flatMap(t -> t.getPlayers().stream())
.sorted(Comparator.comparing(Player::getGols).reversed())
.limit(11L).collect(Collectors.toList());
}

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s