问题描述
我有一个来自服务的对象 List(Item) 列表。 我想使用 Java 8 流将 List(Item) 列表转换为 DB 表 ItemEntity 对象。 在那个 List(Item) Item-> have 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 中最好的方法
1楼
一般来说,对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);
}
我目前无法运行上面的代码,但我希望它可以帮助您找到您正在寻找的解决方案。
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;
}