collections—在Java8中将值从一种类型的集合复制到另一种类型的集合

tyu7yeag  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(574)

我有两个目标 Set<Foo> fooSet 以及 Set<Bar> barSet . Foo 是实体对象 Bar 是我要用于将数据发送到ui的dto。我想复制 fooSet 进入 barSet .

public class Foo {
    @Id
    @Column(name = "Category_Id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long categoryId;

    @OneToMany(mappedBy="productCategory")
    private Set<ProductEntity> products;
}

public class BarDto {

   private Long categoryId;

   private Set<ProductDto> products;

}

我正在尝试将实体转换为dto对象,如:

public BarDto mapDomainToDto(Foo domain) {

        BarDto barDto= new BarDto();
        barDto.setCategoryId(domain.getCategoryId());
       //trying to do something like:
       barDto.setProducts(domain.getProducts());
}

在Java8中有什么方法可以实现这一点吗?

jtjikinw

jtjikinw1#

我们通常写模型Map器。或者你可以使用一些像http://modelmapper.org/getting-started/

pw9qyyiw

pw9qyyiw2#

java 8本身不提供这种Map特性,对于纯java来说,剩下的就是手动调用getter和setter,就像您已经做的那样:

BarDto barDto = new BarDto();
barDto.setCategoryId(domain.getCategoryId());
barDto.setProducts(domain.getProducts());
...

只要这类对象Map和参数的数量较少,这本身就不错。对于更复杂的对象层次结构,我建议使用mapstruct。modelmapper是它的替代品(imho,mapstruct是一种更易于配置和使用的方法,尽管它做同样的工作)。

@Mapper
public interface FooBarMapper {

    FooBarMapper INSTANCE = Mappers.getMapper(FooBarMapper.class);

    BarDto fooToBarDto(Foo domain);
}
BarDto barDto = FooBarMapper.INSTANCE.fooToBarDto(domain);

回到Java8,我敢打赌您提到的是流api、可选的或与函数范式相关的任何东西。同样,在这个版本或任何更新版本的java中都没有这样的特性。但是,它可以帮助您使用上面的库Map对象集合:

FooBarMapper mapper = FooBarMapper.INSTANCE;

List<Foo> fooList = ...
List<BarDto> barDtoList = fooList.stream()
                                 .map(mapper::fooToBarDto)
                                 .collect(Collectors.toList());

相关问题