Отфильтруйте список объектов с помощью потока

#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());