2016-05-04 41 views
12

:mapToInt vs Collectors.summingInt()() toplamı() Bir akışından bir tamsayı değeri toplamak istediğinizde, bunu yapmanın iki temel yolu vardır

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

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

ilk dönen Boks içerir tamsayı & kutudan çıkarır, ancak ikincisine fazladan bir adım atılır.

Daha verimli/daha açık hangisi?

+6

Tamamen benim düşüncem: ikincisi okumak daha kolay. –

+4

Hangi yaklaşımın daha etkili bir kıyaslama olduğunu bilmek istiyorsanız, ancak ikinci yaklaşım okuyucu IMHO için daha nettir. – Flown

cevap

13

İki farklı kullanım durumunun kesişimine bakıyorsunuz. mapToInt(…)'u kullanmak, terminal işleminden önce diğer IntStream işlemlerini zincirlemenizi sağlar. Tersine, Collectors.summingInt(…), diğer toplayıcılarla, örn. groupingBy toplayıcıda alt koleksiyoncu olarak kullanılır. Bu kullanım durumları için, hangisinin kullanılacağı hakkında bir soru yoktur. Özel durumunuzda, daha fazla işlem zincirlemediğinizde veya kollektörlerle ilk etapta uğraşırken, bu iki yaklaşım arasında temel bir fark yoktur. Yine de, daha okunabilir olanı kullanmak bir noktaya sahiptir. Genellikle, akışta aynı işi yapan önceden tanımlanmış bir işlem olduğunda, bir toplayıcı kullanmazsınız. .reduce(…)'u kullanabildiğiniz zaman collect(Collectors.reducing(…))'u kullanmazdınız, değil mi?

Sadece kısa mapToInt(mapFunc).sum(), aynı zamanda conceptionally ne olur, öncelikle bu int s özetlemek sonra, bir int dönüştürmek için normal soldan sağa sıra takip etmektedir. Bu, bu alternatifi .collect(Collectors.summingInt(mapFunc)) üzerinden tercih etmeyi haklı buluyor.

+1

iyi fikir. Söyledikleriniz tek bir ara yüzün burada kompozisyondan daha basit olmasıdır. Haklı mıyım efendim? –

+1

@ holi-java: bu bir yön. – Holger

+0

teşekkürler. Cevabınız, kompozisyonun daha karmaşık olduğunu düşünmeme izin verin, çünkü bunları nasıl bir araya getireceğinizi bilmeniz gerekir, örneğin: Dekoratör Tasarım Kalıbı. –