1. Verificando

Acho que você já deve estar entediado em aprender como encadear fluxos de dados. Você quer finalmente fazer algo com os dados.

A Streamclasse tem três métodos padrão que não constroem fluxos, mas verificam que tipo de dados estão neles. Esses métodos são: anyMatch(), allMatch(), e noneMatch().

boolean anyMatch(rule)método

Este método verifica se o stream possui pelo menos um elemento que satisfaça a regra que é passada para o método. Se houver tal elemento, o método retorna true, caso contrário false.

Exemplos

Código Observação
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
boolean result = stream.anyMatch(x -> x > 0);

true
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.anyMatch(x -> x > 0);

true
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.filter(x -> x < 0).anyMatch(x -> x > 0);

false

No último exemplo, primeiro retemos apenas os elementos menores que zero e, em seguida, verificamos o resultado para ver se algum dos elementos filtrados é maior que zero. Claro, esses elementos não estão mais lá.

Método booleano allMatch(rule)

Esse método verifica se todos os elementos no fluxo correspondem à regra (também conhecida como predicado). A regra é passada como um argumento para o método:

Código Observação
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
boolean result = stream.allMatch(x -> x > 0);
true
(todos os elementos maiores que zero)
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.allMatch(x -> x > 0);
false
(existem elementos menores ou iguais a zero?)
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.filter(x -> x < 0).allMatch(x -> x < 0);
true
(mantivemos os elementos que são menores que zero)

No último exemplo, primeiro permitimos que apenas elementos menores que zero passem pelo filtro e, em seguida, verificamos se todos os elementos retidos são menores que zero. A verificação produz um resultado positivo.

método booleano noneMatch(rule)

O noneMatch()método verifica se o fluxo não possui elementos que correspondam à regra aprovada. É como o oposto do anyMatch()método.

Código Observação
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
boolean result = stream.noneMatch(x -> x > 0);

false
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.noneMatch(x -> x > 0);

false
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.filter(x -> x < 0).noneMatch(x -> x > 0);

true

4
Tarefa
Java Core,  nível 6lição 5
Bloqueado
join: at the right time in the right place
The join method is very useful and is often used to terminate a thread. Think about where and on what object you need to call this method to have the result displayed
18
Tarefa
Java Core,  nível 6lição 5
Bloqueado
Horse racing
Programming is better than gambling... Still, horse races and other races perfectly illustrate multithreading! Figure out what the code does, and implement a method that counts the number of horses that have crossed the finish line. One more thing: you need to wait for the longshots to finish the race.

2. Classes utilitárias: Optionalclasse

Às vezes é muito inconveniente para os programadores trabalhar com nullreferências. Por exemplo, suponha que você esteja comparando duas strings. Se ambas as variáveis ​​não forem null, você pode simplesmente chamar s1.equals(s2), e tudo funcionará. Mas se s1puder ser null, então você tem que escrever um código que lide com esta situação para evitar um erro NullPointerException.

É por isso que os programadores criaram a Optional<T>classe utilitária. Seu código é mais ou menos assim:

Código Observação
class Optional<Type>
{
   private final Type value;
   private Optional() { this.value = null;}
   private Optional(value) { this.value = value;}
   public static <Type> Optional<Type> of(Type value)
   {
      return new Optional<Type>(value);
   }

   public boolean isPresent()
   {
      return value != null;
   }

   public boolean isEmpty()
   {
      return value == null;
   }

   public Type get()
   {
      if (value == null)
      {
         throw new NoSuchElementException();
      }
      return value;
   }

   public Type orElse(Type other)
   {
      return value != null ? value : other;
   }

   public Type orElseThrow()
   {
      if (value == null)
      {
         throw new NoSuchElementException();
      }
      return value;
   }
}










Verifica se o valor não é null



Verifica se o valor é null




Retorna o valor armazenado. Lança uma exceção se o valor for nulo.







Retorna o valor não nulo armazenado. Ou se o valor armazenado for null, retorna o valor passado como um argumento de método.



Retorna o valor não nulo armazenado ou lança uma exceção se o valor for nulo.

O propósito desta classe é simplesmente armazenar um objeto T (uma referência a um objeto cujo tipo é T). A referência de objeto dentro de um Optional<T>objeto pode ser null.

Essa classe permite que os programadores escrevam um código um pouco mais bonito. Vamos comparar:

Usando Opcional Não usando Opcional
public void printString(String s)
{
   Optional<String> str = Optional.ofNullable(s);
   System.out.println(str.orElse(""));
}
public void printString(String s)
{
   String str = s != null ? s : "";
   System.out.println(str)
}

Um Optionalobjeto sempre pode ser comparado a outro Optionalobjeto usando o equalsmétodo, mesmo que armazenem nullreferências.

Simplificando, a Optionalclasse permite que você escreva verificações "bonitas" nulle ações "bonitas" no caso de um Optionalobjeto armazenar um nullvalor.


9
Tarefa
Java Core,  nível 6lição 5
Bloqueado
Promotion during political debates
Mr Chump is our candidate! And we'll help him a bit by making him give a speech, and then another, and then another during a political debate. We'll help him a little by making him talk until all the available time has been taken. Threads come to our rescue!

3. Encontrar elementos

Vamos voltar para a Streamaula. A Streamclasse tem mais 4 métodos que permitem pesquisar elementos em um fluxo. Esses métodos são findFirst(), findAny(), min()e max().

Optional<T> findFirst()método

O findFirst()método simplesmente retorna o primeiro elemento no fluxo. Isso é tudo que ele faz.

A coisa mais interessante a notar aqui é que o método não retorna um Tobjeto, mas sim um Optional<T>objeto wrapper. Isso garante que o método nunca retornará nullapós falhar em localizar um objeto.

Exemplo:

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String str = list.stream().findFirst().get(); // Hello

Para maior esclarecimento, vamos quebrar a última linha em várias linhas:

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");

Stream<String> stream = list.stream();
Optional<String> result = stream.findFirst();
String str = result.get(); // Hello

O último get()método é simplesmente recuperar o valor armazenado dentro do Optionalobjeto.

Optional<T> findAny()método

O findAny()método retorna qualquer elemento do stream e termina ali. Esse método é semelhante ao findFirst(), mas é ótimo para fluxos usados ​​em operações paralelas.

Ao processar fluxos em paralelo, pode ser que um elemento já tenha sido encontrado em alguma parte de um fluxo, mas ainda não está claro se é o primeiro ou não.

Se muitos elementos corresponderem a todos os filtros e for importante para o programador obter exatamente o primeiro deles, o findFirst()método é o que deve ser chamado. Se o programador souber que, na realidade, 0 ou 1 elemento corresponderá a todos os filtros, basta simplesmente chamar findAny()- e isso será mais rápido.

Optional<T> min(Comparator<T>)método

O min()método usa um comparatorobjeto para comparar todos os elementos no fluxo e retorna o elemento mínimo. A maneira mais conveniente de definir um objeto comparador é com uma função lambda.

Exemplo de busca pela string mais curta:

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String min = list.stream().min( (s1, s2)-> s1.length()-s2.length() ).get();

Optional<T> max(Comparator<T>)método

O max()método usa um comparatorobjeto para comparar todos os elementos no fluxo e retorna o elemento máximo. A maneira mais conveniente de definir um objeto comparador é com uma função lambda.

Exemplo de busca pela string mais longa:

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String max = list.stream().max( (s1, s2)-> s1.length()-s2.length() ).get();
4
Tarefa
Java Core,  nível 6lição 5
Bloqueado
Justice
Justice is the name of an ancient Terrian deity that no one ever saw in the flesh. That said, Justice is sometimes encountered in man-made systems. We've got some mice here. For some reason, one of the mice, the alpha male, eats first while the others wait. Figure out why and remove this method call.
9
Tarefa
Java Core,  nível 6lição 5
Bloqueado
Arranging calls to join()
First, the cat gives birth to kittens. Then all the kittens climb out of the basket in random order. Finally, the cat brings them back into the basket. These events for one cat may be interspersed with events for another cat. Now implement this scenario with join().