Operando e removendo um item do fluxo
1. Visão geral
Neste tutorial rápido, aprenderemos sobre as várias maneiras pelas quais podemos operar em um item em um fluxo Java 8 e, em seguida, removê-lo quando a operação for concluída.
2. Configuração
Vamos definir nosso objetoItem primeiro. Este é um objeto simples com um único campoint.
Possui um método que determina se o objeto está qualificado para operação, com base no valor interno:
class Item {
private int value;
// constructors
public boolean isQualified() {
return value % 2 == 0;
}
public void operate() {
System.out.println("Even Number");
}
}
Agora podemos criar uma fonte para o nossoStream, que pode ser uma coleção deItems:
List- itemList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
itemList.add(new Item(i));
}
3. Filtrando itens
Em muitos casos, se quisermos fazer algo com um subconjunto de itens, podemos usar o métodoStream#filter e não precisamos remover nada primeiro:
itemList.stream()
.filter(item -> item.isQualified())
...
4. Operando e removendo um item
4.1. Collection.removeIf
Podemos usarStreams para iterar e operar sobre a coleção deItems.
UsandoStreams, podemos aplicar funções lambda conhecidas comoPredicates. Para ler mais sobreStreamsePredicates, temos outro artigohere.
Podemos criar umPredicate que determinaria se umItem se qualifica para ser operado:
Predicate- isQualified = item -> item.isQualified();
NossoPredicate filtrará osItems em que queremos operar:
itemList.stream()
.filter(isQualified)
.forEach(item -> item.operate());
Assim que terminarmos de operar os itens no stream, podemos removê-los usando o mesmoPredicate que usamos anteriormente para filtrar:
itemList.removeIf(isQualified);
Internally, removeIf uses an Iterator to iterate over the list and match the elements using the predicate. Agora podemos remover quaisquer elementos correspondentes da lista.
4.2. Collection.removeAll
Também podemos usar outra lista para conter os elementos que foram operados e removê-los da lista original:
List- operatedList = new ArrayList<>();
itemList.stream()
.filter(item -> item.isQualified())
.forEach(item -> {
item.operate();
operatedList.add(item);
});
itemList.removeAll(operatedList);
Ao contrário deremoveIf que usa um Iterador,removeAll uses a simple for-loop to remove all the matching elements in the list.
5. Conclusão
Neste artigo, vimos uma maneira de operar um item no Java 8 Streams e removê-lo. Também vimos uma maneira de fazer isso usando uma lista adicional e removendo todos os elementos correspondentes.
O código fonte para este tutorial e os casos de teste relevantes estão disponíveisover on GitHub.