Java Streams
Como motivação para meu primeiro post aqui no TabNews decidi mostrar um pouco sobre a manipulação de listas utilizando a API Java Streams.
Sempre senti dificuldade em entender essa api e passei anos como dev java sem utilizar esse recurso, mas nos últimos anos venho me aperfeiçoando em JavaScript e nele tem funções como .map
, .find
, .reduce
entre outras, e senti um ganho de produtividade imensa, foi daí que decidi ter o mesmo ganho em java.
Java Streams é uma API inicialmente introduzida no Java 8 e vem tendo atualizações interessantes para melhorar seu uso.
Java Streams tem como princípio fazer a manipulação de Collections
de forma mais simples juntamente alinhada com uma programação mais funcional
utilizando as functions lambda
.
Lembrete: Se você não sabe como fazer com for normal
talvez streams não seja para você, então cuidado
ao utilizar essa API poderosa;
Com grandes poderes vem grandes responsabilidade ~ Ben Parker
Mais sobre: https://www.devmedia.com.br/java-streams-api-manipulando-colecoes-de-forma-eficiente/37630
Documentação oficial:
Vou mostrar alguns exemplos lidando com listas no modo tradicional e com streams
Para os exemplos a seguir vamos assumir que temos a seguinte lista
private static List<Person> personList = new ArrayList<Person>();
personList.add(new Person(1, "Bob", 'M', 25));
personList.add(new Person(2, "Alice", 'F', 18));
personList.add(new Person(3, "John", 'M', 20));
personList.add(new Person(4, "Michael", 'M', 32));
Foreach
Como você pode ver a baixo não há muita diferença, (Eu particularmente prefiro no modo normal ainda) mas prometo que nos próximos exemplos terá maior impacto.
- Normal
for(Person p: personList) {
System.out.println(p.getName());
}
- Lambda
personList.stream().forEach(p -> {
System.out.println(p.getName());
});
Map
Para o map
temos como objetivo criar uma lista com apenas os nomes
- Normal
List<String> names = new ArrayList<String>();
for (Person p : personList) {
names.add(p.getName());
}
- Lambda
List<String> names = personList.stream()
.map(Person::getName)
.collect(Collectors.toList());
Filter
Objetivo e obter uma lista com todas as person do sexo masculino
- Normal
List<Person> personTempList = new ArrayList<Person>();
for (Person p : personList) {
char sex = p.getSex();
if('M' == sex) {
personTempList.add(p);
}
}
- Lambda
List<Person> personTempList = personList.stream()
.filter(p -> 'M' == p.getSex())
.collect(Collectors.toList());
Bem esses são apenas alguns exemplos para o post, mais exemplos de código você encontra no meu Git.