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

在Java8中,将值从一种类型的集合复制到另一种类型的集合,java,collections,java-8,java-stream,Java,Collections,Java 8,Java Stream,我有两个set objectset fooSet和set barSetFoo是实体对象,Bar是我要用于将数据发送到UI的DTO。我想将fooSet中的所有属性复制到barSet中 public class Foo { @Id @Column(name = "Category_Id") @GeneratedValue(strategy = GenerationType.AUTO) private Long categoryId; @O

我有两个set object
set fooSet
set 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;

}

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

通常我们编写模型映射器。或者你可以使用一些库,比如

Java 8本身不提供这种映射功能,对于纯Java,剩下的就是手动调用getter和setter,就像您已经做的那样:

BarDto barDto = new BarDto();
barDto.setCategoryId(domain.getCategoryId());
barDto.setProducts(domain.getProducts());
...
只要此类对象映射和参数的数量较低,这本身就不错。对于更复杂的对象层次结构,我推荐。ModelMapper是它的替代方案(IMHO、MapStruct是更易于配置和使用的方法,尽管它的作用相同)

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

FooBarMapper mapper = FooBarMapper.INSTANCE;

List<Foo> fooList = ...
List<BarDto> barDtoList = fooList.stream()
                                 .map(mapper::fooToBarDto)
                                 .collect(Collectors.toList());
FooBarMapper mapper=FooBarMapper.INSTANCE;
列表傻瓜=。。。
List barDtoList=doulist.stream()
.map(映射器::fooToBarDto)
.collect(Collectors.toList());

Foo和Bar类之间的关系是什么?您可以编写一个用于对话的转换器方法,并使用类似于
fooSet.stream().map(e->convertFooToBar()).collect(toSet())
,有一些库用于将一个模型映射到另一个模型,如ModelMapper@Eran更新了问题此问题与之类似,我觉得如何更灵活地使用
ModelMapper
,编写一些实用程序函数并在整个应用程序中使用,其他任何模型都不使用我对MapStruct有着积极的体验。这是品味的问题:)OP可以做出选择。
@Mapper
public interface FooBarMapper {
 
    FooBarMapper INSTANCE = Mappers.getMapper(FooBarMapper.class);

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

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