我有一个来自服务的对象List(Item)的列表。 我想使用Java 8流将List(Item)列表转换为DB表ItemEntity对象。在该List(Item)Item->中具有VarietyList,如果VarietyList(itemVariety)具有数据,则需要创建多个ItemEntity对象。如果VarietyList(itemVariety)为空,则需要创建一个ItemEntity对象。
下面的每个代码Java都可以正常工作,我需要在JAVA 8 Stream函数中使用此代码。
List<Item> itemList = from some services;
List<ItemEntity> itemEnt= new ArrayList();
for (Item item : itemsList) {
if (CollectionUtils.isNotEmpty(item.getVarietyList())) {
for (ItemVariety itemVariety : item.getVarietyList()) {
itemEnt.add(loadItemData(item , itemVariety));
}
} else {
itemEnt.add(loadItemData(item, null));
}
}
private ItemEntity loadItemData(Item itemType, ItemVariety itemVariety) {
ItemEntity itemEntity = new ItemEntity();
itemEntity.setName(itemType.getName());
if (itemVariety != null) {
itemEntity.setVarietyName(itemVariety .getName());
}
return cropEntity;
}
请向我推荐JAVA8中的最佳方法
答案 0 :(得分:4)
一般而言,可以将遍历类A
的实例列表的for循环转换为原始列表中的每个项目创建类B
的实例
List<A> as = .... ;
List<B> = as.stream().map(a -> createB(a)).collect(Collectors.toList());
其中
private B createB(A a) {
//returns new B() based on given a
}
对于原始列表中的每个项目,您可以创建多个B实例,则for循环可以变成
List<A> as = .... ;
List<B> = as
.stream()
.flatMap(a -> CreateBs(a))
.collect(Collectors.toList());
其中
private Stream<B> createBs(A a) {
// returns Stream<B> based on a
}
您处于第二种情况,所以您createBs(A)
是
private Stream<ItemEntity> createItemEntity(Item item) {
return item.getVarietyList().isEmpty() ?
Stream.of(loadItemData(item, null)) :
item.getVarietyList().stream(x -> mapItemVarietyToItemEntity(item, x));
}
private ItemEntity mapItemVarietyToItemEntity(Item item, ItemVariety variety) {
loadItemData(item, variety);
}
目前我无法运行上面的代码,但希望它可以帮助您找到所需的解决方案。
答案 1 :(得分:2)
如果您真的想使用流api,则可以执行以下操作,但是IMO在普通的旧Java中更具可读性。
List<ItemEntity> itemEnt = itemsList.stream()
.flatMap(item -> {
return CollectionUtils.isNotEmpty(item.getVarietyList())
? item.getVarietyList.stream().map(variety -> loadItemData(item, variety))
: Stream.of(loadItemData(item, null))
}).collect(Collectors.toList());
private ItemEntity loadItemData(Item itemType, ItemVariety itemVariety) {
ItemEntity itemEntity = new ItemEntity();
itemEntity.setName(itemType.getName());
if (itemVariety != null) {
itemEntity.setVarietyName(itemVariety .getName());
}
return cropEntity;
}