JAVA 8:需要在流中执行List迭代并转换另一个对象的列表

时间:2019-02-14 14:56:32

标签: java java-8 java-stream

我有一个来自服务的对象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中的最佳方法

2 个答案:

答案 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;
}