До java8 мы писали такой код:

    List<ResultDTO> resources = Lists.newArrayList();        

    List<Product> productList = details.getProducts();
    for (Product product : productList) {
        ResultDTO result = new ResultDTO();
        result.setName(product.getName);
        result.setNumber(product.getNumber);

        resources.add(resourceDetail);
    }

А на Java8 я пишу так:

List<ResultDTO> resources = Lists.newArrayList();
details.getProducts.stream().forEach( product -> {
    ResultDTO result = new ResultDTO();
    result.setName(product.getName);
    result.setNumber(product.getNumber);

    resources.add(resourceDetail);
} );

Интересно, есть ли какие-то советы, когда мы просматриваем поток, создаем объекты ResultDTO, устанавливаем его свойства, а затем в список?

Заранее спасибо.

3
diligent 26 Ноя 2016 в 16:56

2 ответа

Лучший ответ

Создание списка и изменение его внутри потоковых операций - это анти-шаблон. Вы должны позволить потоку создать список за вас:

List<ResultDTO> resources = 
    details.getProducts()
           .stream()
           .map(this::createResultDTO)
           .collect(Collectors.toList());

Если метод createResultDTO создает ResultDTO из продукта (вы, конечно, можете встроить его код в карту, но он гораздо менее читабелен).

7
David Conrad 27 Ноя 2016 в 22:13

Как упоминал JB, вы хотите создать список из потока.

List<ResultDTO> resources = details.getProducts()
                                   .stream()
                                   .map(this::createResultDTO)
                                   .collect(Collectors.toList());

А вот и метод createResultDTO.

public ResultDTO createResultDTO(Product p){
    ResultDTO result = new ResultDTO();
    result.setName(p.getName);
    result.setNumber(p.getNumber);
    return result;
}

Вы можете поместить этот метод в тот же класс и использовать

.map(this::createResultDTO)

Или в другом классе с именем ProductResultDTO и используйте следующее:

.map(ProductResultDTO::createResultDTO)

2
Pankaj Singhal 26 Ноя 2016 в 14:27