我有这个方法。
filteredListIn.addAll(Stream.of(listRef)
.filter(results ->
results.getTitle().contains(query.toString().toLowerCase())
));
用这两个变量
private List<Results> listRef = new ArrayList<>();
List<Results> filteredListIn = new ArrayList<>();
但我得到的是
找到addAll(Stream)filteredListIn.addAll(Stream.of(listRef)^方法Collection.addAll(Collection)不适用(参数不匹配;Stream不能转换为Collection)方法List.addAll(Collection)不适用。
问题出在哪里,我该如何解决?
有没有可能是因为我在api 24下使用外部库来支持流?
你必须收集一个列表中的所有流元素,才能将其添加到一个集合中。
filteredListIn.addAll(listRef.stream()
.filter(results -> results.getTitle().contains(query.toString().toLowerCase()))
.collect(Collectors.toList());
顺便说一下 Stream.of(listRef)
回报 List<Results>
而没有办法 .getTitle()
关于 List
. 我想你的意思是要做 listRef.stream().filter...
而不是 Stream.of(listRef).filter...
无论如何,这是一个标准的例子,它证明了你不应该在每个操作中使用流。你可以将流减少到。
listRef.removeIf(results -> !results.getTitle().contains(query.toString().toLowerCase()));
filteredListIn.addAll(listRef);
注意: .removeIf
将有效地操作于 listRef
所以你应该 clone
如果需要。
addAll
期待一个 Collection
参数。只要一个流没有被收集,它的类型是 Stream
其中独立于 Collection
. 其他答案给你一个简单的解决方案:收集到一个列表,然后添加这个列表。
不过我想说的是,这并不是最有效的解决方案,而且会带来相当大的内存开销:首先将流收集到一个新的列表中,然后将这个列表中的所有项目复制到你现有的列表中,最后垃圾回收器会释放临时列表的占用空间。
这个开销(为临时列表的后备数组分配内存)可以通过不收集流,而用 forEach
终端操作。
Stream.of(listRef)
.filter(results -> results.getTitle().contains(query.toString().toLowerCase()))
.forEach(filteredListIn::add);
如果你的名单一开始就是空的,最好的解决办法是直接收集。
final List<...> filteredListIn = Stream.of(listRef)
.filter(results -> results.getTitle().contains(query.toString().toLowerCase()))
.collect(Collectors.toList()); // or .toUnmodifiableList