在filter方法中使用Java流添加到列表

时间:2018-09-28 06:09:25

标签: java-8 java-stream

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

当我尝试输出列表'trues'的值时,它将返回一个空列表。为什么会这样呢?进行流操作时,列表的引用会更改吗?

注意:我可以使用'collect()'方法添加到其中。

2 个答案:

答案 0 :(得分:1)

不要这样做。

应该使用filter方法filter流,而不是向其他列表添加内容。另外,您的流没有任何终端操作-这是错误的方法。

如前所述,将其更改为使用collect。这样会更易于阅读和维护。

答案 1 :(得分:1)

您的代码不正确,因为使用filter将项目添加到列表中会违反filter的目的。

您应该通过收集结果来终止filter管道。这里的流是Open,因此无法刷新结果到列表;

使用:

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

或者,如果您要使用这种方式,而不是使用收集器功能关闭流

map2.values().stream().filter(value-> map1.get(value) ? trues1.add(value) : false).count();