如何解决“add all in list 无法应用到”

Jon*_*nny 11 java android java-stream

我有这个方法:

filteredListIn.addAll(Stream.of(listRef)
    .filter(results ->
            results.getTitle().contains(query.toString().toLowerCase())
     ));
Run Code Online (Sandbox Code Playgroud)

有了这两个变量:

private List<Results> listRef = new ArrayList<>();
List<Results> filteredListIn = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

但我得到

为 addAll(Stream) 找到了已过滤的ListIn.addAll(Stream.of(listRef) ^ 方法 Collection.addAll(Collection) 不适用(参数不匹配;Stream 无法转换为 Collection)方法 List.addAll(Collection) 不适用

有什么问题,我该如何解决?

这可能是因为我使用外部库来支持 api 24 下的流吗?

Tit*_*lum 10

您必须收集列表中的所有流元素才能将其添加到集合中:

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

  • `Stream.of(listRef)` 将返回 `List&lt;Results&gt;`,并且 `List` 上没有方法 `.getTitle()`。所以这段代码应该会抛出错误。 (5认同)

Ani*_*wat 7

FYIStream.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);
Run Code Online (Sandbox Code Playgroud)

注意:.removeIf将有效地操作,listRef所以clone如果需要,你应该这样做。

  • 是的,你是对的,没有注意到输入参数。不管怎样,我认为使用stream()方法更容易。 (6认同)
  • @raven1981 在你的IDE中尝试一下。`Stream.of(` 接受 var-args,而不是 `Collection` 或 `List`。 (5认同)
  • Stream.of 返回结果流,它与 listRef.stream() 相同,所以我看不到那里的问题。https://developer.android.com/reference/java/util/stream/Stream#of(T...) (3认同)
  • @Titulum 最大的优点就是简洁。此外,Stream API 将创建额外的对象,并且由于这看起来不像是对大列表的操作,因此它比流要高效得多。 (2认同)