группирование значений с разными значениями в столбцах с использованием java лямбда - PullRequest
0 голосов
/ 14 января 2020

У меня есть этот объект:

QuoteProductDTO с тремя столбцами (имя, значение1, значение2)

    List<QuoteProductDTO> lstQuoteProductDTO = new ArrayList<>();

    lstQuoteProductDTO.add( new QuoteProductDTO("product", 10, 15.5) );
    lstQuoteProductDTO.add( new QuoteProductDTO("product", 05, 2.5) );
    lstQuoteProductDTO.add( new QuoteProductDTO("product", 13, 1.0) );
    lstQuoteProductDTO.add( new QuoteProductDTO("product", 02, 2.0) );

Мне нужно получить консолидацию (новый объект QuoteProductDTO):

имя первого столбца, мне нужно получить первое значение "product".

второе значение (value1) Мне нужно получить наибольшее значение 13.

и третий столбец I хе, чтобы получить сумму всех значений 20.

1 Ответ

1 голос
/ 15 января 2020

Это берет текущие предоставленные данные и генерирует новый объект с необходимыми данными. Он использует Collectors.teeing() метод Java 12 +

С учетом следующих данных:

        ArrayList<QuoteProductDTO> lstQuoteProductDTO = new ArrayList<>();
        ArrayList<QuoteProductDTO> nextQuoteProductDTO = new ArrayList<>();

        // empty Quote for Optional handling below.
        QuoteProductDTO emptyQuote = new QuoteProductDTO("EMPTY", -1, -1);

        lstQuoteProductDTO.add(
                new QuoteProductDTO("Product", 10, 15.5));
        lstQuoteProductDTO.add(
                new QuoteProductDTO("Product", 05, 2.5));
        lstQuoteProductDTO.add(
                new QuoteProductDTO("Product", 13, 1.0));
        lstQuoteProductDTO.add(
                new QuoteProductDTO("Product", 02, 2.0));

Вы можете объединиться, как вы хотите, в новый экземпляр QuoteProductDTO.

        QuoteProductDTO prod = lstQuoteProductDTO.stream()
                .collect(Collectors.teeing(
                        Collectors.maxBy(Comparator
                                .comparing(p -> p.value1)),
                        Collectors.summingDouble(
                                p -> p.value2),
                        (a, b) -> new QuoteProductDTO(
                                a.orElse(emptyQuote).name,
                                a.orElse(emptyQuote).value1,
                                b.doubleValue())));

        System.out.println(prod);               

Отпечатки

Product, 13, 21.0

Можно также взять список списков различных продуктов и поместить их в список консолидированных продуктов. Добавьте следующее в новый список, а затем добавьте их в основной список.


        nextQuoteProductDTO.add(
                new QuoteProductDTO("Product2", 10, 15.5));
        nextQuoteProductDTO.add(
                new QuoteProductDTO("Product2", 25, 20.5));
        nextQuoteProductDTO.add(
                new QuoteProductDTO("Product2", 13, 1.0));
        nextQuoteProductDTO.add(
                new QuoteProductDTO("Product2", 02, 2.0));

        List<List<QuoteProductDTO>> list = List.of(
                lstQuoteProductDTO, nextQuoteProductDTO);

Теперь объедините их в список объектов.

        List<QuoteProductDTO> prods = list.stream().map(lst -> lst.stream()
                .collect(Collectors.teeing(
                        Collectors.maxBy(Comparator
                                .comparing(p -> p.value1)),
                        Collectors.summingDouble(
                                p -> p.value2),
                        (a, b) -> new QuoteProductDTO(
                                a.orElse(emptyQuote).name, 
                                a.orElse(emptyQuote).value1,
                                b.doubleValue()))))
                .collect(Collectors.toList());

         prods.forEach(System.out::println);

Печать

Product, 13, 21,0
Product2, 25, 39,0

Я создал класс, чтобы помочь продемонстрировать это.

class QuoteProductDTO {
    public String name;
    public int value1;
    public double value2;

    public QuoteProductDTO(String name, int value1,
            double value2) {
        this.name = name;
        this.value1 = value1;
        this.value2 = value2;
    }

    public String toString() {
        return name + ", " + value1 + ", " + value2;
    }
}



...