Украсить для цикла, используя поток и лямбда - PullRequest
0 голосов
/ 16 ноября 2018

В настоящее время я получил этот код:

@GetMapping("/all/")
    public Iterable<Article> getAllArticle(){
        ArrayList<ArticleEntity> articleEntities = Lists.newArrayList(articleProviderComponent.getAllArticle());
        ArrayList<Article> articles = Lists.newArrayList();
        for(ArticleEntity articleEntity : articleEntities){
            articles.add(ArticleMapper.articleEntity2Article(articleEntity));
        }
        return articles;
    }

Хранилище возвращает Iterable, которое я хочу преобразовать в ArrayList. Кроме того, я хочу преобразовать каждый Entity в POJO.

Я пытался использовать что-то вроде list.foreach(ArticleMapper::ArticleMapper.articleEntity2Article), который отлично работает, но не возвращает новый список.

Ответы [ 4 ]

0 голосов
/ 16 ноября 2018

В основном остальные ответы показывают правильное направление. Но если вы хотите сохранить ту же семантику своего кода, необходимо принять во внимание что-то дополнительное.

Согласно JavaDoc Collecotrs.toList

Возвращает Collector, который накапливает входные элементы в новый List. Там нет никаких гарантий на тип, изменчивость, сериализуемость или потокобезопасность возвращаемых List; если больше требуется контроль над возвращенным List, используйте toCollection(Supplier).

Возвращенные articles имеют тип ArrayList<ArticleEntity>. Таким образом, этот список, например, изменяемые.

Тип возврата метода getAllArticle(): Iterable<Article>. Таким образом мы можем назвать

Iterator<Article> iterator = getAllArticle().iterator(); 

Но если вам нужно позвонить iterator.remove() "нет никаких гарантий в отношении изменчивости [...] базовой коллекции. Следовательно, это может привести к ( JavaDoc )

UnsupportedOperationException - если операция удаления не поддерживается этим итератором

Чтобы сохранить поведение исходного кода, используйте Collectors.toCollection:

List<Article> articles = articleEntities.stream()
        .map(ArticleMapper::articleEntity2Article)
        .collect(Collectors.toCollection(Lists::newArrayList));

Это вернет articles, построенное Lists.newArrayList().

0 голосов
/ 16 ноября 2018

Передайте List, map в целевой тип и collect в List:

List<Article> articles = articleEntities.stream().map(ArticleMapper::articleEntity2Article).collect(Collectors.toList());
0 голосов
/ 16 ноября 2018

Поскольку Iterable задано как общее , насколько это возможно, оно не обеспечивает возможность потока его контента, но с помощью StreamSupport вы можете генерировать stream из экземпляра Iterable и уменьшите количество операций до one :

final List<Article> articlesList = 
 StreamSupport.stream(articleProviderComponent.getAllArticle().spliterator(), false)            
 .map(ArticleMapper::articleEntity2Article)
 .collect(Collectors.toList());
0 голосов
/ 16 ноября 2018

Простое map выполнит эту работу:

List<Article> articles = articleEntities.stream()
                                        .map(ArticleMapper::articleEntity2Article)
                                        .collect(Collectors.toList());

map преобразует каждый элемент во что-то еще, используя указанный метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...