当前位置: 代码迷 >> java >> JAVA 8:需要在流中执行列表迭代并转换另一个对象的列表
  详细解决方案

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

热度:81   发布时间:2023-07-31 13:36:36.0

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

一般来说,对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);
}

我目前无法运行上面的代码,但我希望它可以帮助您找到您正在寻找的解决方案。

如果您真的想使用流 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;
}