在Java8中,将值从一种类型的集合复制到另一种类型的集合
我有两个set object在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 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());