Your code has a major problem which is the comparison of Strings, you can read more about it in that matter.
Anyway, there are better ways to do what you need:
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import lombok.Data;
import lombok.RequiredArgsConstructor;
public class Main {
public static void main(String[] args) {
List<List<Produto>> listaDeListas = Arrays.asList(
Arrays.asList(new Produto("Produto 1"), new Produto("Produto 2")),
Arrays.asList(new Produto("Produto 3")),
Arrays.asList(new Produto("Produto 4"), new Produto("Produto 5"), new Produto("Produto 6")),
Arrays.asList(new Produto("Produto 7"))
);
// Condição desejada
Predicate<Produto> filtroProduto = p -> p.getNome().equalsIgnoreCase("Produto 1");
// Recupera a lista contendo o produto
List<Produto> listaComOcorrencia = listaDeListas.stream()
.flatMap(List::stream)
.filter(filtroProduto)
.collect(Collectors.toList());
System.out.println(listaComOcorrencia);
// Recupera a contagem de produtos com o critério
long count = listaDeListas.stream()
.flatMap(List::stream)
.filter(filtroProduto)
.count();
System.out.println(count);
}
@Data
@RequiredArgsConstructor
public static class Produto {
private final String nome;
}
}
The output of the program is:
[Main.Produto(nome=Produto 1)]
1
Where on the first stream, I retrieved the (s) list(s) containing the product, and the Agrupei.
Probably the second filter is the most interesting, since it only recovers a product count meeting that condition. You can then compare and see if the product has already been put using count != 0
.
Anyway, if you DO NOT want duplicates, and do not want to bother comparing if the object already exists, you should use the structure Set, which does not allow duplicates
You have a list, this list has lists of products, and you want to find the list that has the desired product?
– nullptr
It seems an XY problem, you do not wish to have duplicates?
– nullptr