Eu tenho 2 listas, aquele contém uma lista de números e a lista de outro, um dos nomes. Tenho prefixado os nomes com um número da primeira lista, seguido por um sublinhado. Eu quero filtrar a segunda lista com base em todos os números encontrados na primeira lista.
O que eu tentei.
List<String> numberList = new ArrayList<>();
numberList.add("1_");
numberList.add("9_");
List<String> nameList = new ArrayList<>();
nameList.add("1_John");
nameList.add("2_Peter");
nameList.add("9_Susan");
List<String> filteredList = Stream.of(numberList.toArray(new String[0]))
.filter(str -> nameList.stream().anyMatch(str::startsWith))
.collect(Collectors.toList());
O código acima é executado sem erro, mas o FilteredList está vazio. É evidente que eu estou fazendo algo errado.
O FilteredList deve conter apenas:
1_John
9_Susan
Você chama startsWith
na errado String
s (por exemplo, você testar se "1_".startsWith("1_John")
em vez de "1_John".startsWith("1_")
).
Você deve transmitir mais nameList
e utilizar numberList
para a filtragem:
List<String> filteredList =
nameList.stream()
.filter(str -> numberList.stream().anyMatch(str::startsWith))
.collect(Collectors.toList());
PS Stream.of(numberList.toArray(new String[0]))
é redundante. Use numberList.stream()
em seu lugar.