Фильтр API Java Stream - PullRequest
       8

Фильтр API Java Stream

3 голосов
/ 20 июня 2019

У меня есть код:

static void doSmth() {
    ArrayList<String> list = new ArrayList<>();
    for (int i = 0; i < 30; i++) {
        list.add(String.valueOf(i));
    }
    list.stream().filter("1329"::contains).map(s -> s + "a").forEach(System.out::println);
}

Почему я получил:

 1a
 2a
 3a
 9a
 13a
 29a

Я ожидал пустой вывод, потому что список не содержит "1329".

Ответы [ 3 ]

10 голосов
/ 20 июня 2019

потому что

.filter("1329"::contains)

означает

.filter(s -> "1329".contains(s))

не

.filter(s -> s.contains("1329"))

Как я думаю, вы думаете, что это значит.

Итак, ваш списокудерживайте:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ... 25, 26, 27, 28, 29]
    ^  ^  ^                 ^               ^                           ^

Который "1329" содержит 1,2, 3, 9, 13 and 29

2 голосов
/ 20 июня 2019

Это потому, что когда вы выполняете итерацию от 0 до 29, .contains просто проверяет, присутствует ли каждый отдельный элемент в списке или нет в строке 1329.

Так как 1,2,3 ... присутствуют, они возвращают true, следовательно, они отображаются и добавляются с "a". Если вы хотите проверить, присутствует ли вся строка 1329, используйте .equals()

filter("1329"::equals)
1 голос
/ 22 июня 2019

Вы получаете вышеуказанный вывод, потому что вы используете строку Java «1329», чтобы проверить, содержит ли она какие-либо из строк из списка. Поскольку строка «1329» содержит [«1», «2», «3», «9», «13», «29»], поэтому она отфильтровывает их, а затем вы добавляете «a» к каждой отфильтрованной строке.

Чтобы проверить, содержит ли список «1329», вы можете напрямую использовать метод contains () в java.utit.List. Он должен получить пустой набор, поскольку в списке нет строки «1329».

Чтобы получить из списка строки, равные «1329», вы можете использовать метод фильтра вместе с методом «Строки».

list
    .stream()
    .filter(s -> "1329".equals(s))
    .map(s -> s + "a")
    .forEach(System.out::println);

Теперь в вашем случае приведенный выше код ничего не даст в выводе, так как список не содержит строку "1329".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...