2017-11-16 103 views
5

mam coś takiego:Strumień Java. Podsumowując dwa pola w strumieniu obiektów

Integer totalIncome = carDealer.getBrands().stream().mapToInt(brand -> brand.getManufacturer().getIncome()).sum(); 
Integer totalOutcome = carDealer.getBrands().stream().mapToInt(brand -> brand.getManufacturer().getOutcome()).sum(); 

Jak mogę napisać, że w jeden strumień? zebrać f.e. Pair<Integer, Integer> z totalIncome i totalOutcome?

EDYCJI:

Dziękujemy wam za komentarze, odpowiedzi i involvment. Miałbym pytanie o inne podejście do tego problemu z wykorzystaniem strumieni. Co o tym myślisz:

+0

Czy chodziło Ci 'powrócić nowej pary <> (totalIncome, totalOutcome);'? –

+0

Tak, ale wydaje mi się, że wywołanie strumienia dwa razy nie jest wydajne (po raz pierwszy dla 'dochodów' i po raz drugi dla' wyniku'). Zastanawiałem się, czy mógłbym dołączyć do nich, aby ostatecznie uzyskać tylko jeden strumień, który zwraca sumę "dochodu" i sumy "wyniku"? – user3529850

+0

Jeśli chcesz, abyś zrobił iterację po użyciu pętli i zwiększaj dwie sumy w oparciu o dwa pola. – Pshemo

Odpowiedz

2

Bez prawidłowego pomiaru - wszystko zgaduje. Jedynym argumentem, z którym się zgadzam, jest czytelność - nie jest tak w tym przypadku; ale w przypadku, gdy chciał wiedzieć, to dla celów akademickich, ty może zrobić:

int[] result = carDealer.getBrands() 
     .stream() 
     .map(brand -> new int[]{brand.getManufacturer().getIncome(), 
           brand.getManufacturer().getOutcome()}) 
     .collect(Collector.of(
        () -> new int[2], 
        (left, right) -> { 
         left[0] += right[0]; 
         left[1] += right[1]; 
        }, 
        (left, right) -> { 
         left[0] += right[0]; 
         left[1] += right[1]; 
         return left; 
        })); 
+2

Redukcja powinna być bezpaństwowa. Powinieneś raczej użyć 'collect()' z identycznym 'accumulator' i' combiner'. – shmosel

+0

@ shmosel w prawo ... za dużo dzisiaj kodowania. thx – Eugene

+0

Nie potrzebujesz "Kolekcjonera", chyba że przekazujesz cechy lub finisher. Po prostu zadzwoń ['collect (dostawca, akumulator, kombajn)'] (https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#collect-java.util.function .Supplier-java.util.function.BiConsumer-java.util.function.BiConsumer-). – shmosel