Operando e removendo um item do fluxo

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.