Stream com lambda e Collections

package market;

 

import java.util.ArrayList;

import java.util.Comparator;

import java.util.List;

 

class Curso {

 

 private String nome;

 private int alunos;

 

 public Curso(String nome, int alunos) {

         this.nome = nome;

         this.alunos = alunos;

 }

 

 public int getAlunos() {

         return alunos;

 }

 

 public String getNome() {

         return nome;

 }

 

 @Override

 public String toString() {

         return nome + " - " + alunos;

 }

}

 

class ExemploCursos {

 public static void main(String[] args) {

         List<Curso> cursos = new ArrayList<Curso>();

         cursos.add(new Curso("Python", 45));

         cursos.add(new Curso("JavaScript", 150));

         cursos.add(new Curso("Java", 113));

         cursos.add(new Curso("C", 55));

 

         // ordenar usando lambda e comparator

         cursos.sort(Comparator.comparing(c -> c.getAlunos()));

 

         // iterar todos os cursos e imprimir usando lambda

         cursos.forEach(c -> System.out.println(c.getNome()));

Saída

Python

C

Java

JavaScript

         // cursos que tem mais de 100 alunos

         cursos.stream().filter(c -> c.getAlunos() > 100).forEach(System.out::println);

Saída

Java - 113

JavaScript - 150

 

         // lista somente o numero de alunos de cursos que tem mais 100 alunos

         cursos.stream().filter(c -> c.getAlunos() > 100).map(c -> c.getAlunos()).forEach(System.out::println);

Saída

113

150

         // soma o anterior

         int soma = cursos.stream().filter(c -> c.getAlunos() > 100).mapToInt(Curso::getAlunos).sum();

         System.out.println(soma);

Saída

263

         // retorna um curso que tenha +100 alunos

         Optional<Curso> opcionalCurso = cursos.stream().filter(c -> c.getAlunos() > 100).findAny();

         Curso localCurso = opcionalCurso.orElse(null);

         System.out.println(localCurso);

Saída

Java - 113

 

         // se tem, imprima

         opcionalCurso.ifPresent(c -> System.out.println(c));

Saída

Java - 113

 

         // valor medio

         OptionalDouble media = cursos.stream().filter(c -> c.getAlunos() > 100).mapToInt(Curso::getAlunos).average();

         System.out.println(media.orElse(0));

Saída

131.5

 

         // transforma um stream em uma List

         List<Curso> novaLista = cursos.stream().filter(c -> c.getNome().charAt(0) == 'J').collect(Collectors.toList());

         novaLista.forEach(System.out::println);

Saída

Java - 113

JavaScript - 150

 

         System.out.println(novaLista);

Saída

[Java - 113, JavaScript - 150]

 

         // transforma um stream em uma Map (chave e valor)

         Map<String, Integer> novaMap = cursos.stream().filter(c -> c.getNome().charAt(0) == 'J')

                         .collect(Collectors.toMap(c -> c.getNome(), c -> c.getAlunos()));

         novaMap.forEach((nome, alunos) -> System.out.println(nome + " tem " + alunos + " alunos"));

Saída

Java tem 113 alunos

JavaScript tem 150 alunos

 

         System.out.println(novaMap);

Saída

{Java=113, JavaScript=150}

 

 }

}