我有以下代码:(为了勇敢而简化)
public void search(Predicate<String> predicate, Elements elements)
{
List<SearchResult> searchResults = elements.stream()
.filter(element -> predicate.test(element.ownText()))
.map(element -> new SearchResult(element.ownText(), element.baseUri(),element.tagName()))
.collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)
但是现在,我想要另一个列表,该列表将包含没有映射的所有过滤元素。是否可以使用流来做到这一点,或者我应该为此更改为 foreach 循环?
您可以收集过滤后的元素,然后使用此列表将元素映射到搜索结果:
public void search(Predicate<String> predicate, Elements elements) {
List<Element> filteredElements =
elements.stream()
.filter(element -> predicate.test(element.ownText()))
.collect(Collectors.toList());
List<SearchResult> searchResults =
filteredElements.stream()
.map(element -> new SearchResult(element.ownText(),element.baseUri(),element.tagName()))
.collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)
这不会比其他答案的解决方案花费更多时间,但没有副作用,线程安全且易于阅读和理解。
一个简单的方法是
List<Element> filteredElements = new ArrayList<>();
List<SearchResult> searchResults = elements.stream()
.filter(element -> predicate.test(element.ownText()))
.peek(filteredElements::add)
.map(element ->
new SearchResult(element.ownText(),element.baseUri(),element.tagName()))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7329 次 |
| 最近记录: |