Java 8 – Stream e Lambda

java-lambda-expression1

 

Concatenando Streams

 
 
 Stream<String> stringStream1 = 
                Stream.of("AAA", "BBB", "CCC", "ABC");
 Stream<String> stringStream2 = 
                Stream.of("AAA", "BBB", "CCC", "DDD");

 Stream<String> concatStream = 
                Stream.concat(stringStream1, stringStream2);
 concatStream.forEach(s -> System.out.println(s));
 

Stream.concat permite concatenar dois streams. Um vez que temos um stream, podemos executar um forEach no mesmo para iterá-lo. O código acima concatema os dois streams e ainda imprime o valor dos itens após a concatenação.

Outra formas para fazer o forEach com o println:

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

Outra forma, mais simplificada de fazer o concat e o println.

 
  Stream.concat(stringStream1, stringStream2)
      .forEach(System.out::println)
 

Concatenando apenas ítens não repetidos

 
 stringStream1 =
     Stream.of("AAA", "BBB", "CCC", "ABC");
 stringStream2 =
     Stream.of("AAA", "BBB", "CCC", "DDD");

 // Concat only non repeated values
 Stream.concat(stringStream1, stringStream2)
       .distinct().forEach(System.out::println);
 

Convertendo lista de String em Stream e contando ítens não repetidos

 
 List<String> list =
     Arrays.asList("AAA", "BBB", "CCC", "BBB", "CCC", "AAA", "AAA");
 System.out.println(list.stream().distinct().count());
 

Para os próximos exemplos, vamos utilizar um objeto Person.

 
public class Person {

 private String firstName;
 private int age;
 
 public Person(){
 
 }
  
 public Person(String firstName, int age){
 this.firstName = firstName;
 this.age = age;
 }

 //getters and setters ...
 
}
 

Trabalhando com Listas e Streams

  
 Person hebert = new Person("Hebert", 24);
 Person john = new Person("John", 25);
 Person rafael = new Person("Rafael", 30);
 Person paulo = new Person("Paulo", 35);
 Person alfredo = new Person("Alfredo", 30);

 List<Person> people1 = Arrays.asList(hebert, john, alfredo);
 List<Person> people2 = Arrays.asList(rafael, paulo);
 

Concatenando listas e printando lista final

 
 // concat to a list
 List<Person> peopleList = 
              Stream.concat(people1.stream(), people2.stream())
                    .collect(Collectors.toList());
 peopleList.forEach(p -> System.out.println(p.toString()));
 

Apenas fazendo um paralelo com Java 7, o seguinte código em Java 8 usando forEach

 
 peopleList.forEach(p -> System.out.println(p.toString()));
 

Seria similar ao código abaixo no Java 7:

 
 for (People p : peopleList){
    System.out.println(p.toString());
 }
 

Concatenando como Set

 
 // concat to set 
 people1 = Arrays.asList(hebert, john);
 people2 = Arrays.asList(hebert, john, rafael, paulo);
 Set<Person> set = Stream
                        .concat(people1.stream(), people2.stream())
                        .collect(Collectors.toSet());

Filtrando lista por nome e populando em nova lista (collect to list).

 List<Person> johnList =
          peopleList.stream()
                    .filter(p -> p.getFirstName().equals("John"))
                    .map(p -> new Person(p.getFirstName(), p.getAge()))
                    .collect(Collectors.toList());
 

Soma das idades de uma lista de pessoas, usando stream, mapToInt e sum;

 
 int sum = peopleList.stream().mapToInt(p -> p.getAge()).sum();
 

Calculando média de idade de Pessoas da lista utilizando stream e mapToInt com método average.

 
 OptionalDouble average =
          peopleList.stream()
                    .mapToInt(p -> p.getAge()).average();
 if (average.isPresent()) {
    System.out.println(average.getAsDouble());
 }
 

Contando quantas pessoas da lista possuem nomes terminados em “o”, utilizando o filter, endsWith e collect counting.

 
 long count = peopleList.stream()
                   .filter(p -> p.getFirstName()
                   .endsWith("o"))
                   .collect(Collectors.counting());
 

Retornar primeira pessoa da lista que tenha o nome terminado em “a” utilizando filter, endsWith, findFirst. Caso não encontrado, retorna null.

 
 Person resultPerson = peopleList.stream()
                          .filter(p -> p.getFirstName().endsWith("a"))
                          .findFirst().orElse(null);
 

Filtra lista de pessoas com pessoas com nome terminado em “o” e printa o resultado.

 
peopleList.stream().filter(p -> p.getFirstName()
                   .endsWith("o"))
                   .forEach(System.out::println);
 

Ordena lista de pessoas por primeiro nome

 
 peopleList.stream()
           .sorted(Comparator.comparing(Person::getFirstName));
 

Ordena lista de pessoas por idade na ordem decrescente

 
 peopleList.stream()
           .sorted(Comparator.comparing(Person::getAge)
           .reversed());
 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios são marcados com *