如何解决 "在列表中全部添加无法应用到"

问题描述 投票:0回答:1

我有这个方法。

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下使用外部库来支持流?

java android
1个回答
10
投票

你必须收集一个列表中的所有流元素,才能将其添加到一个集合中。

filteredListIn.addAll(listRef.stream()
  .filter(results -> results.getTitle().contains(query.toString().toLowerCase()))
  .collect(Collectors.toList());

7
投票

顺便说一下 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 如果需要。


3
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.