JAVA 8: необходимо выполнить итерацию списка в потоке и преобразовать список другого объекта - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть список объектов List (Item) из сервиса.Я хочу преобразовать список List (Item) в объект ItemEntity таблицы DB, используя поток Java 8.В этом List (Item) Item-> have VarietyList, если у VarietyList (itemVariety) есть данные, необходимо создать столько объектов ItemEntity.если VarietyList (itemVariety) пуст, то нужно создать один объект ItemEntity.

Ниже Java для каждого кода работает отлично, мне нужен этот код в функции потока JAVA 8.

    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 голосов
/ 14 февраля 2019

Вообще говоря, цикл for над списком экземпляров класса A, который создает экземпляр класса 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 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);
}

В данный момент я не могу запустить приведенный выше код, но я надеюсь, что он может помочь вам найти решение, которое выищу.

0 голосов
/ 14 февраля 2019

Если вы действительно хотите использовать потоковый 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;
}
...