#java #stream
Вопрос:
У меня есть список объектов. Я хочу создать еще один список, в который можно добавить определенные объекты из созданного списка. Я хочу использовать потоковый фильтр, но я не понимаю, где я ошибаюсь. Есть какие-нибудь предложения? Большое спасибо.
Первоначальный список:
final List<CategoryModel> categoryList = doSearch(query, params, CategoryModel.class);
Список с объектами, отфильтрованными из первого списка:
List<CategoryModel> sitemapList = (List<CategoryModel>) categoryList.stream().filter(categoryModel -> selectCategoryForSitemap(categoryModel));
Функция для объектов фильтрации:
private boolean selectCategoryForSitemap(CategoryModel categoryModel){
if(categoryModel.getMetaRobots() != null) {
if (categoryModel.getMetaRobots() == CmsRobotTag.INDEX_FOLLOW || categoryModel.getMetaRobots() == CmsRobotTag.INDEX_NOFOLLOW) {
return Boolean.TRUE;
}
}else if (categoryModel instanceof BrandCategoryModel || categoryModel instanceof CategoryModel) {
if(!categoryModel.getCode().equals("1")) {
return Boolean.TRUE;
}
}
return Boolean.FALSE;
}
Ответ №1:
List<CategoryModel> sitemapList = categoryList.stream()
.filter(categoryModel -> selectCategoryForSitemap(categoryModel))
.collect(Collectors.toList());
Вы не можете просто направить поток на что-то.
Если вы хотите получить результат, вам нужно вызвать одну из операций терминала. В этом случае вам нужно collect
.
Ответ №2:
Одна из проблем заключается в том, что вам нужно включить в поток сборщик, чтобы вернуть список. Но могут возникнуть дополнительные проблемы, которые не столь очевидны.
List<CategoryModel> sitemapList = categoryList.stream()
.filter(categoryModel -> selectCategoryForSitemap(
categoryModel)).collect(Collectors.toList());