JAVA 8: изменить значение в потоке - PullRequest
0 голосов
/ 25 августа 2018

У меня есть список объектов, и я зацикливаюсь на каждом элементе этого списка, и я изменяю несколько атрибутов.

Вот мой код, который я хочу преобразовать для использования потокового API.

        for (Besoin besoin : besoins) {
        String purchaseOrderPosition = besoin.getReferenceOa().trim();
        if(purchaseOrderPosition != "") {
            ValeursDynamiques valeursDynamiques = valeursDynamiquesService.DynamicValues(supplierNumber, purchaseOrderPosition);
            besoin.setQuantityInTransit(valeursDynamiques.getUsedValues().getQteEnTransit());
            besoin.setQuantityOrdered(valeursDynamiques.getUsedValues().getQteCommandee());
            besoin.setQuantityDelivered(valeursDynamiques.getUsedValues().getQteRecue());
            besoin.setDeliveryDateScheduled(valeursDynamiques.getUsedValues().getDateLivraisonPlanifiee());
            besoin.setDeliverydateConfirmed(valeursDynamiques.getUsedValues().getDateLivraisonConfirmee());
            besoin.setQuantityRestExpedited(valeursDynamiques.getUsedValues().getSoldeAExpedier());
        }   
    }

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Это должно быть правильно, так как вы изменяете не список, а атрибут элемента:

    besoins.stream().forEach(besoin -> {
    String purchaseOrderPosition = besoin.getReferenceOa().trim();
    if(!purchaseOrderPosition.isEmpty()) {
        ValeursDynamiques valeursDynamiques = valeursDynamiquesService.DynamicValues(supplierNumber, purchaseOrderPosition);
        besoin.setQuantityInTransit(valeursDynamiques.getUsedValues().getQteEnTransit());
        besoin.setQuantityOrdered(valeursDynamiques.getUsedValues().getQteCommandee());
        besoin.setQuantityDelivered(valeursDynamiques.getUsedValues().getQteRecue());
        besoin.setDeliveryDateScheduled(valeursDynamiques.getUsedValues().getDateLivraisonPlanifiee());
        besoin.setDeliverydateConfirmed(valeursDynamiques.getUsedValues().getDateLivraisonConfirmee());
        besoin.setQuantityRestExpedited(valeursDynamiques.getUsedValues().getSoldeAExpedier());
    }   
}

вы можете напрямую использовать forEach() из списка, и я должен использовать isEmpty() intead != "".

Но как уже говорилось ранее, зачем здесь использовать Stream? besoins.stream().forEach(besoin -> менее читабелен, чем for (Besoin besoin : besoins)

Обычно, когда поток предпочитают фильтровать, отображать и извлекать некоторые данные

0 голосов
/ 25 августа 2018

Изменение элементов из источника потока - это , а не структурное изменение самого источника. Да, вы можете сделать это, даже в parallel это не подведет. Но это вряд ли точечные потоки, где сделаны для; если у вас нет других операций, которые могут вам понадобиться (filter, map и т. д.), ваш цикл имеет гораздо больший смысл.

Например, ArrayList документация гласит:

... просто установка значения элемента не является структурной модификацией

Таким образом, ваш код, который изменяет элемент, но не источник потока (List в вашем случае) не throw ConcurrentModificationException.

...