java8如何收集数据并将其作为对象的属性添加到List中

dil*_*ent 3 collections java-8 java-stream

在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);
    }
Run Code Online (Sandbox Code Playgroud)

和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);
} );
Run Code Online (Sandbox Code Playgroud)

我想知道当我们遍历流创建ResultDTO对象设置其属性然后到列表时是否有一些提示?

提前致谢.

JB *_*zet 7

在流操作中创建列表并对其进行修改是一种反模式.您应该让流为您创建列表:

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

createResultDTO方法将从Product创建ResultDTO(您当然可以在map中内联其代码,但它的可读性更低).

  • 我个人可能会在`ProductResultDTO`上添加一个名为`fromProduct`的静态工厂方法,这样你就可以编写`map(ProductResultDTO :: fromProduct)` (5认同)