Оптимизация нескольких потоков в один цикл


Я пытаюсь найти лучший способ для оптимизации преобразователей ниже, чтобы первый поток я называю convertAndGroupForUpdate, который вызывает преобразование и соответствующие сопоставления.

Любая помощь, чтобы оптимизировать этот код будет массово оценили.

public List<GroupedOrderActionUpdateEntity> convertAndGroupForUpdate(List<SimpleRatifiableAction> actions) {
    List<GroupedOrderActionUpdateEntity> groupedActions = new ArrayList<>();

    Map<String, List<SimpleRatifiableAction>> groupSimple = actions.stream()
        .collect(Collectors.groupingBy(x -> x.getOrderNumber() + x.getActionType()));

    groupSimple.entrySet().stream()
        .map(x -> convertToUpdateGroup(x.getValue()))
        .forEachOrdered(groupedActions::add);

    return groupedActions;
}

public GroupedOrderActionUpdateEntity convertToUpdateGroup(List<SimpleRatifiableAction> actions) {
    List<OrderActionUpdateEntity> actionList = actions.stream().map(x -> convertToUpdateEntity(x)).collect(Collectors.toList());

    return new GroupedOrderActionUpdateEntity(
        actions.get(0).getOrderNumber(),
        OrderActionType.valueOf(actions.get(0).getActionType()),
        actions.get(0).getSource(),
        12345,
        actions.stream().map(SimpleRatifiableAction::getNote)
            .collect(Collectors.joining(", ", "Group Order Note: ", ".")),
        actionList);
}

public OrderActionUpdateEntity convertToUpdateEntity(SimpleRatifiableAction action) {
    return new OrderActionUpdateEntity(action.getId(), OrderActionState.valueOf(action.getState()));
}


184
1
задан 22 марта 2018 в 12:03 Источник Поделиться
Комментарии
1 ответ

Указывая вниз по течению Collector для Collectors.groupingBy

Есть альтернатива Collectors.groupingBy(Function, Collector) метод, который позволяет определить дальнейшие шаги, что вы хотите сделать с посредником List<SimpleRatifiableAction> значения после группирования.

Затем, с немного переименования, с помощью метода ссылок, плюс несколько удобных методов как SimpleRatifiableAction.getKey():

public String getKey() {
return getOrderNumber() + getActionType();
}

Вы можете иметь метод, который читает:

// dropping method visibility modifier for brevity
List<GroupedOrderActionUpdateEntity> process(List<SimpleRatifiableAction> actions) {
return new ArrayList<>(actions.stream()
.collect(Collectors.groupingBy(SimpleRatifiableAction::getKey,
Collectors.collectingAndThen(Collectors.toList(),
this::createUpdateEntity)))
.values());
}

Как только цикл, агрегирование нескольких значений

Внутри convertToUpdateGroup(List)теперь переименован в createUpdateEntity(List)вы потокового дважды List аргумент. Хотя это не должно быть проблемой в большинстве случаев, есть еще вариант, чтобы один раз цикл должен быть один из оставшихся мест для оптимизации (надеюсь, анализ выполнения/микро-бенчмаркинг, чтобы доказать это).

Это достигается путем создания StringJoiner экземпляр себе (вместо того, чтобы полагаться на Collectors.joining()). Чтобы избежать подобных List.get(0) звонки, вы можете также сделать ссылку на него один раз.

В целом, поставив его:

// dropping method visibility modifier for brevity
GroupedOrderActionUpdateEntity createUpdateEntity(List<SimpleRatifiableAction> actions) {
SimpleRatifiableAction first = actions.get(0);
StringJoiner joiner = new StringJoiner(", ", "Group Order Note: ", ".");
List<OrderActionUpdateEntity> updateEntities = new ArrayList<>();
actions.forEach(v -> {
joiner.add(v.getNote());
updateEntities.add(v.createUpdateEntity());
});
return new GroupedOrderActionUpdateEntity(
first.getOrderNumber(),
OrderActionType.valueOf(first.getActionType()),
first.getSource(),
12345,
joiner.toString(),
updateEntities);
}

SimpleRatifiableAction.createUpdateEntity() есть также другой метод удобства, который вы можете рассмотреть:

public OrderActionUpdateEntity createUpdateEntity() {
return new OrderActionUpdateEntity(getId(), OrderActionState.valueOf(getState()));
}

0
ответ дан 23 марта 2018 в 04:03 Источник Поделиться