Java 8 在filter方法中使用Java流添加到列表 Map map1=newhashmap(); map1.put(1,true); map1.put(2,true); map1.put(3,false); map1.put(4,true); map1.put(5,false); Map map2=新的HashMap(); map2.put(1,1); map2.put(2,2); map2.put(3,3); map2.put(4,4); map2.put(5,5); List valids=new ArrayList(); map2.values().stream().filter(value->map1.get(value)?valids.add(account):false);
当我试图输出列表Java 8 在filter方法中使用Java流添加到列表 Map map1=newhashmap(); map1.put(1,true); map1.put(2,true); map1.put(3,false); map1.put(4,true); map1.put(5,false); Map map2=新的HashMap(); map2.put(1,1); map2.put(2,2); map2.put(3,3); map2.put(4,4); map2.put(5,5); List valids=new ArrayList(); map2.values().stream().filter(value->map1.get(value)?valids.add(account):false);,java-8,java-stream,Java 8,Java Stream,当我试图输出列表valids的值时,它返回一个空列表。为什么会这样?执行流操作时,列表的引用是否更改 注意:我可以使用collect()方法添加到它。不要这样做 filter方法应该是filter流,而不是向其他列表添加内容。此外,您的流没有任何终端操作-这是一种错误的方法 如您所述,将其更改为使用collect。这样会更易于阅读和维护。您的代码是不正确的,因为使用filter将项目添加到列表中,这违背了filter的目的 您应该通过收集结果来终止filter管道。此处的流是开放的,因此无法将结
valids
的值时,它返回一个空列表。为什么会这样?执行流
操作时,列表的引用是否更改
注意:我可以使用collect()
方法添加到它。不要这样做
filter
方法应该是filter
流,而不是向其他列表添加内容。此外,您的流没有任何终端操作-这是一种错误的方法
如您所述,将其更改为使用
collect
。这样会更易于阅读和维护。您的代码是不正确的,因为使用filter
将项目添加到列表中,这违背了filter
的目的
您应该通过收集结果来终止filter
管道。此处的流是开放的,因此无法将结果刷新到列表中
使用:
或者,如果您想使用这种方式,则通过收集器函数关闭流
map2.values().stream().filter(map1::get).forEach(trues::add);
不要那样做。一个filter函数应该用于过滤。没有副作用。了解流是如何工作的,正确和不正确的操作是什么。流上没有任何终端操作,因此最后一行是noop:没有任何内容被过滤。javadoc和数百个关于streams的教程都是你的朋友?trues.add(account):false与
map1.get(value)和&trues.add(account)
相同…
map2.values().stream().filter(map1::get).forEach(trues::add);
map2.values().stream().filter(value-> map1.get(value) ? trues1.add(value) : false).count();