Разница между summarizingInt и Collectors.summarizingInt?

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

IntSummaryStatistics stats1 = orderEntries.stream()
            .mapToInt((x) -> x.getAmount()).summaryStatistics();

IntSummaryStatistics stats2 = orderEntries.stream().collect(
            Collectors.summarizingInt(o -> o.getAmount()));

IntSummaryStatistics istats2 = orderEntries.stream().
                            collect( 
                                    () -> new IntSummaryStatistics(),
                                    (i,o) -> i.accept(o.getAmount()),
                                    (i1, i2) -> i1.combine(i2));
IntSummaryStatistics istats = IntStream.of(51,22,50,27,35).
        collect(IntSummaryStatistics::new, IntSummaryStatistics::accept, 
                IntSummaryStatistics::combine);

Какой подход лучше? Какой из них мы должны предпочесть другим?


person KayV    schedule 06.12.2016    source источник
comment
@Holger Третья запись, которую я только что получил из Интернета. Он не синхронизирован с orderEnteries.   -  person KayV    schedule 06.12.2016
comment
Пожалуйста, не меняйте (существенно) код ваших опций. Я ссылаюсь на это в своем ответе, и теперь вы сделали эту ссылку необоснованной.   -  person lexicore    schedule 06.12.2016
comment
@lexicore также добавляет этот код.   -  person KayV    schedule 06.12.2016
comment
См. также "Collectors.summingInt() vs mapToInt().sum()"   -  person Holger    schedule 06.12.2016


Ответы (1)


Я бы предпочел:

IntSummaryStatistics stats = orderEntries
    .stream()
    .collect(Collectors.summarizingInt(OrderEntry::getAmount));

Этот вариант:

IntSummaryStatistics istats = IntStream.of(51,22,50,27,35).
            collect(IntSummaryStatistics::new, IntSummaryStatistics::accept, 
                    IntSummaryStatistics::combine);

это самое худшее, это именно то, что делает IntStream.summaryStatistics, просто написано явно. Так что никаких преимуществ первого варианта.

Я бы выбрал немного измененный второй вариант, потому что с моей точки зрения коллектор лучше представляет бизнес-операцию «суммирование сумм ввода заказов».

person lexicore    schedule 06.12.2016
comment
Принципиальной разницы между .mapToInt(OrderEntry::getAmount).summaryStatistics() и .collect(Collectors.summarizingInt(OrderEntry::getAmount)) нет. Это больше дело вкуса. - person Holger; 06.12.2016
comment
@lexicore Я думаю, что collect(Collectors.summarizingInt(OrderEntry::getAmount)) и collect( Collectors.summarizingInt(o -> o.getAmount())); подобные. Не так ли? - person KayV; 06.12.2016
comment
@KaranVerma Да и нет. Да, это даст вам тот же результат. Нет, во втором случае вы записываете лямбду вместо того, чтобы использовать существующий метод. Я бы определенно предпочел OrderEntry::getAmount. Зачем писать лямбды, если метод уже есть? - person lexicore; 06.12.2016