Добавление в список с использованием потока Java в методе filter - PullRequest
0 голосов
/ 28 сентября 2018
    Map<Integer, Boolean> map1= new HashMap<>();
    map1.put(1, true);
    map1.put(2, true);
    map1.put(3, false);
    map1.put(4, true);
    map1.put(5, false);

    Map<Integer, Integer> map2= new HashMap<>();
    map2.put(1, 1);
    map2.put(2, 2);
    map2.put(3, 3);
    map2.put(4, 4);
    map2.put(5, 5);
    List<Integer> trues = new ArrayList<>();
    map2.values().stream().filter(value-> map1.get(value) ? trues.add(account) : false);

Когда я пытаюсь вывести значения из списка «истины», он возвращает пустой список.Почему это так?Меняется ли ссылка на список при выполнении потоковой операции?

Примечание. Я могу добавить к нему метод метод collect ().

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Ваш код неверен, потому что использование filter для добавления элемента в список, который не соответствует цели filter.

Вы должны прекратить filter конвейер, собирая результат.Поток здесь открыт и, следовательно, не может сбросить результат в список;

Использование:

map2.values().stream().filter(map1::get).forEach(trues::add);

Или если вы хотите использовать этот способ, чем закрывать поток с помощью функции коллектора

map2.values().stream().filter(value-> map1.get(value) ? trues1.add(value) : false).count();
0 голосов
/ 28 сентября 2018

Не делай этого.

filter метод должен filter поток, а не добавлять что-то в какой-то другой список.Кроме того, ваш поток не имеет терминальной операции - это неправильный подход.

Измените его на collect, как вы упомянули.Это было бы более читабельным и поддерживаемым таким образом.

...