Как отфильтровать список с помощью потока Java 8 и массива значений startwith - PullRequest
5 голосов
/ 28 мая 2019

У меня есть 2 списка, один из которых содержит список чисел, а другой список имен. Я поставил перед именами номер из первого списка с последующим подчеркиванием. Я хочу отфильтровать второй список на основе всех чисел, найденных в первом списке.

Что я пробовал.

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());

Приведенный выше код работает без ошибок, но FilterList пуст. Очевидно, я делаю что-то не так.

Фильтрованный список должен содержать только:

1_John

9_Susan

Ответы [ 4 ]

4 голосов
/ 28 мая 2019

Вы вызываете startsWith с неправильными String с (например, вы проверяете, если "1_".startsWith("1_John") вместо "1_John".startsWith("1_")).

Вы должны передавать nameList и использовать numberListдля фильтрации:

List<String> filteredList = 
    nameList.stream()
            .filter(str -> numberList.stream().anyMatch(str::startsWith))
            .collect(Collectors.toList());

PS Stream.of(numberList.toArray(new String[0])) является избыточным.Вместо этого используйте numberList.stream().

3 голосов
/ 28 мая 2019

В качестве альтернативы решению Эрана вы также можете использовать комбинацию removeIf и noneMatch следующим образом:

List<String> filteredList = new ArrayList<>(nameList);
filteredList.removeIf(str -> numberList.stream().noneMatch(str::startsWith));
0 голосов
/ 29 мая 2019
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");

Ниже указан правильный код:

enter image description here

Ваш код использует следующее:

enter image description here

0 голосов
/ 28 мая 2019

Другая попытка дать решение может заключаться в использовании contains, хотя фактическая реализация startsWith и contains различна, но в случае OP оба будут получать одинаковый результат.

List<String> strList = nameList.stream().filter(s->numberList.stream().anyMatch(s::contains)).collect(Collectors.toList());

выход

[1_John, 9_Susan]

...