Оптимизация обхода списка с помощью потока - PullRequest
3 голосов
/ 28 июня 2019

У меня есть List<BatchDTO> со следующим классом

public class BatchDTO {

    private String batchNumber;
    private Double quantity;
.
.
//Getters and setters
}

Что мне нужно сделать, это подвести итог, если batchNumber является дубликатом.Я использовал LinkedHashMap для реализации этого и сделал итерации.Но то, что я хотел бы иметь, является более оптимизированным способом.Могу ли я использовать поток, чтобы сделать это оптимизированным способом.

private static List<BatchDTO > getBatchDTO (Map<String, BatchDTO > batchmap) {
    return batchmap.values().stream().collect(Collectors.toList());
}

private static Map<String, BatchDTO > getBatchMap(List<BatchDTO > batchList, Map<String, BatchDTO > batchMap) {
        for (BatchDTO  batchDTO  : batchList) {
            batchMap = getBatchMap(batchMap, batchDTO );
        }
    return batchMap;
}

private static Map<String, BatchDTO > getBatchMap(Map<String, BatchDTO > batchMap, BatchDTO  batchObject) {
    String batchCode = batchObject.getBatchNumber();
        if(!batchMap.containsKey(batchCode)) {
            batchMap.put(batchCode, batchObject);
        } else {
            batchObject.setQuantity(getTotalQuantity(batchMap,batchObject));
            batchMap.put(batchCode, batchObject);
        }
    return batchMap;
}

private static Double getTotalQuantity(Map<String, BatchDTO > batchmap, BatchDTO  batchObject) {
    return batchmap.get(batchObject.getBatchNumber()).getQuantity() + batchObject.getQuantity();
}

Ответы [ 2 ]

3 голосов
/ 28 июня 2019

Вы можете попробовать использовать stream api способом, предложенным в комментариях @ Naman . И, предполагая, что BatchDTO имеет конструктор всех аргументов, вы можете вернуться от Map к List<BatchDTO>

List<BatchDTO> collect = list.stream()
        .collect(groupingBy(BatchDTO::getBatchNumber, summingDouble(BatchDTO::getQuantity)))
        .entrySet().stream()
        .map(entry -> new BatchDTO(entry.getKey(), entry.getValue()))
        .collect(Collectors.toList());

JavaDoc: groupingBy () , summingDouble ()

2 голосов
/ 28 июня 2019

Возможно, немного нечитабельно с комментариями в коде, но это все, на что у меня есть время.

// Result will be a Map where the keys are the unique 'batchNumber's, and the
// values are the sum of the 'quantities' for those with that 'batchNumber'.
public Map<String, Double> countBatchQuantities(final List<BatchDTO> batches) {
    // Stream over all the batches...
    return batches.stream()

    // Group them by 'batch number' (gives a Map<String, List<BatchDTO>>)
            .collect(Collectors.groupingBy(BatchDTO::getBatchNumber))

    // Stream over all the entries in that Map (gives Stream<Map.Entry<String, List<BatchDTO>>>)
            .entrySet().stream()

    // Build a map from the Stream of entries
    // Keys stay the same
            .collect(Collectors.toMap(Entry::getKey, 

    // Values are now the result of streaming the List<BatchDTO> and summing 'getQuantity'
                    entry -> entry.getValue().stream().mapToDouble(BatchDTO::getQuantity).sum()));
}

Примечание: я не даю никаких обещаний, что этот более оптимизирован, чем вашсуществующий подход ... Но он делает работу с потоками.Примечание. Это приведет к исключению, если quantity равно null для любого из ваших BatchDTO s ...

...