2016-05-04 24 views
12

Quando si desidera sommare un valore intero da un ruscello, ci sono due modi principali per farlo:Collectors.summingInt() vs mapToInt() sum()

ToIntFunction<...> mapFunc = ... 
int sum = stream().collect(Collectors.summingInt(mapFunc)) 

int sum = stream().mapToInt(mapFunc).sum() 

La prima coinvolge boxe tornato intero & unboxing, ma c'è un ulteriore passaggio nel secondo.

Quale è più efficiente/più chiaro?

+6

Puramente la mia opinione: la seconda è più facile da leggere. –

+4

Se vuoi sapere quale approccio è più efficiente, ma il secondo approccio è molto più chiaro per il lettore IMHO. – Flown

risposta

13

Si sta osservando l'intersezione di due casi d'uso altrimenti distinti. L'utilizzo di mapToInt(…) consente di concatenare altre operazioni IntStream prima dell'operazione del terminale. Al contrario, Collectors.summingInt(…) può essere combinato con altri collettori, ad es. utilizzato come collettore a valle in un collettore groupingBy. Per questi casi d'uso, non c'è dubbio su quale usare.

Nel tuo caso particolare, quando non si concatenano più operazioni né si occupano di collezionisti in primo luogo, non vi è alcuna differenza fondamentale tra questi due approcci. Tuttavia, usare quello che è più leggibile ha un punto. Di solito, non usi un raccoglitore, quando c'è una operazione predefinita sullo stream che fa lo stesso. Non useresti collect(Collectors.reducing(…)) quando puoi semplicemente usare .reduce(…), vuoi?

Non solo è mapToInt(mapFunc).sum() cortocircuito, ne consegue anche il solito ordine da sinistra a destra per ciò che accade concettualmente, prima convertire un int, quindi sommare questi int s up. Penso che questo giustifichi preferendo questa alternativa su .collect(Collectors.summingInt(mapFunc)).

+1

buona idea. cosa hai detto che l'interfaccia singola è più semplice della composizione qui. Ho ragione, signore? –

+1

@ holi-java: questo è un aspetto. – Holger

+0

grazie. la tua risposta mi fa pensare che la composizione è più complicata da usare poiché devi sapere come comporli insieme, come ad esempio: Decorator Design Pattern. –